amiga-news ENGLISH VERSION
.
Links| Forum| Kommentare| News melden
.
Chat| Umfragen| Newsticker| Archiv
.

amiga-news.de Forum > Programmierung > CreateTask/CreateProcess [ - Suche - Neue Beiträge - Registrieren - Login - ]

-1- [ - Beitrag schreiben - ]

06.11.2004, 23:41 Uhr

ciVic
Posts: 131
Nutzer
Hallo!

Ich möchte ähnlich wie unter Windows die Funktion CreateThread ein solchen Task erzeugen. Nun klingt das nach CreateTask, allerdings scheint Datei I/O komplett verboten zu sein... CreateProcess erzeugt aber wohl eher einen neuen Process, was unter OS4 wohl inkompatiblitäten erzeugt, da dieser in einem anderen Speicherbereich läuft, und Threads sollten ja alle auf dem selben Speicher zugreiffen. Also nochmal kurz mein Prob: der Task sollte 1. den gleichen Speicherbereich nutzen und 2. Disk I/O zulassen. Was kann ich da tun?

ciVic

[ - Antworten - Zitieren - Direktlink - ]

07.11.2004, 00:19 Uhr

thomas
Posts: 7716
Nutzer

Wo hast du denn das mit den Speicherbereichen her ? Aus Sicht der exec.library sind Prozesse das gleiche wie Tasks. Ich wüßte nicht, daß sich bei OS4 da etwas dran geändert hat. Schau dir mal die Autodocs von CreateNewProc an, da wirst du sicher fündig.

Gruß Thomas

--
Email: thomas-rapp@web.de
Home: home.t-online.de/home/thomas-rapp/

[ - Antworten - Zitieren - Direktlink - ]

07.11.2004, 01:00 Uhr

ciVic
Posts: 131
Nutzer
CreateProcess erzeugt also auch unter OS4 nicht einen Prozess, der seinen eigenen Speicher hat, und dieser neue Prozess kann auf den ganzen Speicher des Ezeugenden zugreiffen? Naja gut, aber leider weiß ich jetzt nicht, wie ich mit CreateProc einfach eine Funktion ausführen kann wie mit CreateTask ;(

ciVic

[ - Antworten - Zitieren - Direktlink - ]

07.11.2004, 01:03 Uhr

thomas
Posts: 7716
Nutzer

Ich sagte doch, schau die CreateNewProc an. CreateProc ist längst überholt.

Gruß Thomas

--
Email: thomas-rapp@web.de
Home: home.t-online.de/home/thomas-rapp/

[ - Antworten - Zitieren - Direktlink - ]

07.11.2004, 02:53 Uhr

ciVic
Posts: 131
Nutzer
Jo hab es damit ausprobiert, ich kann wie bei CreateTask kein printf und keine Datei I/O nutzen. Hab ich vielleicht nen Tag vergessen?

ciVic

[ - Antworten - Zitieren - Direktlink - ]

07.11.2004, 13:23 Uhr

ciVic
Posts: 131
Nutzer
Jo hab es damit ausprobiert, ich kann wie bei CreateTask kein printf und keine Datei I/O nutzen. Hab ich vielleicht nen Tag vergessen?

ciVic

[ - Antworten - Zitieren - Direktlink - ]

07.11.2004, 15:31 Uhr

Holger
Posts: 8116
Nutzer
Zitat:
Original von ciVic:
Jo hab es damit ausprobiert, ich kann wie bei CreateTask kein printf und keine Datei I/O nutzen. Hab ich vielleicht nen Tag vergessen?

ciVic

NP_Output /* filehandle - default is Open("NIL:"...) */

Das sagt doch alles, oder?

mfg
--
Good coders do not comment. What was hard to write should be hard to read too.

[ - Antworten - Zitieren - Direktlink - ]

07.11.2004, 16:06 Uhr

ciVic
Posts: 131
Nutzer
Jo, dass ich genau eine Datei nutzen kann. Andere versuche mit fopen oder Open enden im ersten Fall im Absturz der betroffenen Disk und im zweiten mit einem kompletten Absturz

ciVic

[ - Antworten - Zitieren - Direktlink - ]

07.11.2004, 16:25 Uhr

thomas
Posts: 7716
Nutzer

Du darfst keine ANSI-Funktionen benutzen, die sind nicht multitaskingfähig. Nimm die Funktionen der dos.library stattdessen: Printf, Open, Close, FRead, FWrite etc.

malloc/free darfst du auch nicht benutzen. strcpy und Co. wiederum dürften ungefährlich sein. Alle Funktionen, die Daten statisch zwischenspeichern, funktionieren nicht in einer Multitasking-Umgebung.

Gruß Thomas

--
Email: thomas-rapp@web.de
Home: home.t-online.de/home/thomas-rapp/

[ - Antworten - Zitieren - Direktlink - ]

07.11.2004, 17:45 Uhr

ciVic
Posts: 131
Nutzer
Also ich versuch es grad hiermit:

void simpletask()
{
struct DosLibrary *DOSBase;
char *libname="dos.library";
ULONG ver=37;
DOSBase=(struct DosLibrary *)OpenLibrary(libname, ver);
BPTR f=Open("ram:test3", MODE_NEWFILE);
FWrite(f,(void *)"Hello\n",6,1);
Close(f);
printf("Test2");
if (DOSBase)
CloseLibrary((struct Library *)DOSBase);
while(sharedvar < 0x8000000) sharedvar++;
/* Wait forever because main() is going to RemTask() us */
Wait(0L);
}


Und das per CreateNewProc aufgerufen schmiert ab.printf geht in diesem Fall, da ich als Ausgabe beim Aufruf eine Datei in der Ramdisk gewählt habe. OpenLibrary soll laut Dok nicht das Prob sein. Nehme ich die drei Zeilen, die mit f umgehen raus geht es.

tags[0].ti_Tag=NP_Entry;
tags[0].ti_Data=(Tag)simpletask;
tags[1].ti_Tag=NP_Name;
tags[1].ti_Data=(Tag)"Testtask";
tags[2].ti_Tag=NP_Priority;
tags[2].ti_Data=0;
tags[3].ti_Tag=NP_StackSize;
tags[3].ti_Data=4000;
tags[4].ti_Tag=NP_Output;
tags[4].ti_Data=Open("ram:test2", MODE_NEWFILE);
tags[5].ti_Tag=TAG_DONE;

Und das sind die Tags, die ich an CreateNewProc übergebe.

ciVic


[ Dieser Beitrag wurde von ciVic am 07.11.2004 editiert. ]

[ - Antworten - Zitieren - Direktlink - ]

07.11.2004, 19:18 Uhr

thomas
Posts: 7716
Nutzer

Benutzt du Small oder Large Data-Model ? Bei small mußt du die Funktion mit __saveds oder __geta4 oder geta4(), oder wie das bei deinem Compiler geht, deklarieren.

Zitat:
Wait forever because main() is going to RemTask() us

Solltest du nicht tun. Ein Process hat mehr Daten als eine Task, die werden bei RemTask() nicht freigegeben.

Schau dir mal dieses Beispiel an, das funktioniert: http://home.t-online.de/home/thomas-rapp/download/multi.c


Gruß Thomas

--
Email: thomas-rapp@web.de
Home: home.t-online.de/home/thomas-rapp/

[ - Antworten - Zitieren - Direktlink - ]

07.11.2004, 23:46 Uhr

ciVic
Posts: 131
Nutzer
Ok danke an alle, hab den Fehler. Man muß beim g++ -noixemul verwenden...

ciVic

[ - Antworten - Zitieren - Direktlink - ]


-1- [ - Beitrag schreiben - ]


amiga-news.de Forum > Programmierung > CreateTask/CreateProcess [ - Suche - Neue Beiträge - Registrieren - Login - ]


.
Impressum | Datenschutzerklärung | Netiquette | Werbung | Kontakt
Copyright © 1998-2024 by amiga-news.de - alle Rechte vorbehalten.
.