sleep() aber anders
-
tag
also ich habe folgendes Problem. Ich habe eine Funktion die ich nach beliebigen Unterbrechungen beliebig oft ausführen will (soll vom Anwender angegeben werden wie oft und welche Zeitabstände). Das ganze funktioniert im Prinzip auch schon ... allerdings hab ich dazu sleep() verwendet was glaub ich nicht so toll ist, da das Programm so nicht mehr ansprechbar ist
(im Taskmanager -> keine Rückmeldung) ...
Das ganze ist (wie bereits erwähnt) nicht so toll. Meine Vorstellung einer Ideallösung wäre, dass der Anwender nach wie vor angibt wie oft und in welchen Zeitabständen die Funktion ausgeführt werden soll und er das Programm dann aber weiterverwenden kann und eventuell das ganze abbrechen wenn ihm nach der hälfte der Zeit einfallen sollte er brauchts doch nicht mehr.
Wie macht man sowas nun genau, bzw. am besten ???
Vermutlich irgendwie mit nem neuen Prozess oder ähnlichem eventuell mit nem Timer ???
Wäre auch nett wenn man mir eventuell nen paar gute Links zu dem Thema geben könnte (wenns den wirklich mit nem neuen Prozess funktionieren würde)
mfg
eMpTyPS: ich will jetzt hier nich gleich Code oder sowas (ausser es wäre in 2-3 Zeilen lösbar
)... nur nen Vorschlag was man verwenden sollte bzw. wie man das am besten macht und was man beachten sollte. Meine Lösung mit sleep war halt die einfachste aber auch schlechteste Lösung ;/
-
eMpTy schrieb:
Wie macht man sowas nun genau, bzw. am besten ???
Vermutlich irgendwie mit nem neuen Prozess oder ähnlichem eventuell mit nem Timer ???
Du hast die Frage selber beantwortet.
Wäre auch nett wenn man mir eventuell nen paar gute Links zu dem Thema geben könnte (wenns den wirklich mit nem neuen Prozess funktionieren würde)
-
... k ...
also das mit dem timer bekomm ich dann eventuell noch selber hin ^^ bzw. den brauch ich ja dann nich weil ich den anderen prozess mit sleep machen kann ???
mein problem is aber das mit dem neuen prozess ... sicher gibts da hier im forum einiges dazu ... aber das is dann entweder nicht geeignet bzw. setzt auf etwas auf das ich auch noch nicht so ganz verstehe ^^ ok den start des prozesses bekomm ich ja eventuell (mit etwas glück) auch noch hin aber zum beenden ??? ... da blick ich dann nicht mehr durch und auch was beachtet werden sollte usw.
wär halt gut gewesen wenns zu prozessen eventuell nen tutorial oder was zum nachschlagen gibt ... da hab ich nämlich nix gefunden oder nur falsch gesucht ^^ könnte ja sein das eines der tutorials auf der seite hier was gutes dazu enthält ???
-
hmm ... kann mir eventuell doch noch mal wer helfen ??? ... also ich habe ja meine Funktion die was macht ... diese Funktion möchte ich dann als neuen Thread (prozess ??? was auch immer) starten damit mein Programm normal weiterläuft (was es ja bis jetzt nicht tut wegen sleep() )
jetzt hab ich das gefunden:
[url]http://msdn.microsoft.com/library/deu/default.asp?url=/library/DEU/vccore/html/_core_multithreading.3a_.creating_worker_threads.asp
[/url]und da ist ja das beispiel ... mit dem Arbeitsthread und der Steuerfunktion
UINT MyThreadProc( LPVOID pParam ) { CMyObject* pObject = (CMyObject*)pParam; if (pObject == NULL || !pObject->IsKindOf(RUNTIME_CLASS(CMyObject))) return 1; // if pObject is not valid // do something with 'pObject' return 0; // thread completed successfully } // inside a different function in the program . . . pNewObject = new CMyObject; AfxBeginThread(MyThreadProc, pNewObject); . . .
aber irgendwie versteh ich das nicht ... mit dem Objekt ???
ich will doch nur das meine Funktion in nem eigenen thread(oder was auch immer) läuft ???
dann gibts irgendwie noch was mit
[url] http://www.c-plusplus.net/forum/viewtopic.php?t=39041&highlight=prozess [/url]aber da muss man ja eine Klasse abgeleitet von WinThread erstellen ... und das will ich ja nicht ... will doch nur meine funktion ???
ich versteh im moment überhaupt nichts mehr ;/
-
eMpTy schrieb:
aber da muss man ja eine Klasse abgeleitet von WinThread erstellen ... und das will ich ja nicht ... will doch nur meine funktion ???
dann bastel dir etwas wie das hier:
void thread() { while (!abbruch) // schleife, sonst ist gleich ende mit dem thread { /* * Hier die funktion aufrufen */ Sleep (sleeptime); // rechenzeit abgeben } } ... DWORD id; // thread id // thread starten CreateThread (NULL, 0, (LPTHREAD_START_ROUTINE)thread, NULL, 0, &id); ...
-
Hi,
schau dir mal CreateTimerQueue und CreateTimerQueueTimer an.
Das ist genau das was du brauchst.MfG Spacelord
-
Spacelord schrieb:
Hi,
schau dir mal CreateTimerQueue und CreateTimerQueueTimer an.
Das ist genau das was du brauchst.wow, das sind coole apis, die kannte ich auch noch nicht.
jaja, windows ist halt ein obergeiles system
-
@net ... hab aber trotzdem deine methode verwendet
... mit CreateThread()
funktioniert auch (anscheinend) wunderbar ... jetzt interresiert mich nur noch wie ich den Thread vorzeitig beenden kann
dazu brauch ich vermutlich
HANDLE hThread;
hThread = CreateThread(...);irgendwo hab ich gelesen das man die auch stoppen und resumen kann ... aber leider nicht wie ;/
in der msdn hab ich nix gefunden nur _beginnThread und _endThread usw.
und per google stell ich mich anscheinend zu blöd an ;/
das is ja alles aus CWinThread glaub ich oder ??? ... da wirts doch irgend ne beschreibung zu der Klasse mit den möglichen Funktionen geben ???
mein Compiler/SDK hat irgendwie auch keine richtige hilfe dabei (und die h files sind langweilig ^^)... gibt es eventuell eine Seite im netz auf der man solche Standardfunktionen nachschlagen kann ???
in java gibts glaub ich javadocs oder so ähnlich ... da kann man die Standardklassen + methoden nachschlagen ... aber bei c++ hab ich das noch nicht gefunden ;/
darum hilft mir das sschau dir mal ... an auch nicht oft weiter ... außer ich finds in der msdn, per google oder auf ähnliche weiße
-
eMpTy schrieb:
funktioniert auch (anscheinend) wunderbar ... jetzt interresiert mich nur noch wie ich den Thread vorzeitig beenden kann
am einfachsten mit einem flag, dass der thread in seiner while-schleife abfragt und dass du auf 'true'(= raus aus der schleife) setzen kannst, wenn der thread sterben soll. wenn er aus der funktion rauskommt wird der thread beendet.
eMpTy schrieb:
dazu brauch ich vermutlich
HANDLE hThread;
hThread = CreateThread(...);das brauchste sowieso. das handle muss geschlossen werden 'CloseHandle()' wenn du's nicht mehr brauchst. ist bei einem thread zwar nicht schlimm, aber sauberer auf jeden fall.
eMpTy schrieb:
irgendwo hab ich gelesen das man die auch stoppen und resumen kann ... aber leider nicht wie ;/
guckst du: http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dllproc/base/process_and_thread_functions.asp
da sind die alle aufgelistet. auch 'ResumeThread()' usw.
-
ok danke ... denke jetzt funktionierts endlich so wie ich will ... auch wenn ich das mit dem close glaub ich ned richtig gemacht habe ... kann irgendwie auch nie sicher sagen wann der thread fertig ist kommt ja drauf an wie lange die andere funktion braucht bzw wann der anwender vorher exit macht ... is irgendwie kompliziert ... drum mach ich das close vermutlich vor dem exit bzw. wenn das handel eigentlich noch benutzt wird ... denk ich ^^
aber naja es funktioniert ^^
-
das (oder den?) handle kannste schliessen, wenn du es nicht mehr brauchst. 'CloseHandle()' beeinflusst nicht den thread.
wenn du das ende des threads abwarten willst kannste z.b. sowas machen:
HANDLE hthread = CreateThread (..... ... ... // dem thread sagen, dass er sich beenden soll abbruch = true; // maximal 5 sekunden hat er zeit dafür... if (WAIT_TIMEOUT == WaitForSingleObject (hthread, 5000)) { /* * thread nicht innerhalb von 5 sec tot -> fehler behandeln */ } else { /* * alles ok. der thread ist tot. */ } // das handle wird nicht mehr gebraucht CloseHandle (hthread);
btw: wenn du aus dem thread code aufrufst, den auch dein main-thread nutzt, dann musst du beide synchronisieren z.b. mit critical sections, mutexes o.ä.
ansonsten gibt es abstürze die schwer zu finden sind.
sogenannte 'heisenbugs'