Thread - Systemauslastung
-
Hallo,
ich habe eine DLL geschreiben, in der jede Millisekunde ein Thread gestartet und wieder gelöscht wird. Ist zur seriellen Kommunikation. Die Zeitsteuerung erfolgt über den TMMTimer von Webfritzi.
Nun habe ich das Problem, daß das System sehr stark ausgelastet ist. Bei der genaueren Untersuchung mit dem Windows TaskManagers stellte sich heraus, daß nicht meine Anwendung soviel Rechenleistung verbrät, sondern ein Eintrag namens SYSTEM (alles unter dem Reiter Prozesse).
Hängt das jetzt mit dem Threadorganistation zusammen, oder wie läßt sich das erklären. Am besten wäre noch, wie kann ich das reduzieren? Danke schon mal.
Grüße
Franky
-
ich habe eine DLL geschreiben, in der jede Millisekunde ein Thread gestartet und wieder gelöscht wird.
hört sich ja schrecklich an.... was machst du denn damit?
-
Ich kaufe mir alle 5 Minuten ein neues Auto, wieso komme ich nie von A nach B und bin trotzdem ständig unterwegs?
-
-
Ich möchte mit der DLL- Funktion einen Puffer über die serielle Schnittstelle senden. Die Abarbeitung der API- Funktionen, wie WriteFile und WaitForSingleObject soll in einem separaten Thread ablaufen, um die DLL- Funktion nicht zu blockieren.
Und so ein Puffer ist so um die 10 Bytes groß und soll alle Millisekunde gesendet werden. Da ich mit Borland arbeite, starte ich den thread mit
TWriteThread* WriteThread = new TWriteThread(Buffer, numberofbytes, false);
vorher checke ich, ob noch ein Thread geöffnet ist und schließe den ggfs (terminate, delete). Ich verstehe schon, dass das eine sehr unglückliche Realisierung ist, mir ist aber noch keine andere Möglk. dazu eingeafallen.
Gibt es vielleicht eine Möglichkeit, dass man den Thread startet, die Execute- Funktion wird abgearbeitet und ich auf Wunsch die Execute- Funktion noch mal aufrufe, ohne den thread zu löschen und neu zu starten? Das wäre natürlich viel besser. Danke.
Grüße
Franky
-
Hallo!
verstehe zwar nicht ganz was du meinst aber wie wärs so:
while (TRUE) //schleife bis thread beendet wird im thread { Sleep(1); deine geschichten ;) }
wenn ichs net gerafft hab, vergiss es
[ Dieser Beitrag wurde am 02.12.2002 um 15:49 Uhr von RPD editiert. ]
-
@RPD
Dadurch würde ich ja diesen übergebenen Puffer die ganze Zeit senden. Ich will ihn aber nur einmal senden und wenn eine neuer Puffer mit der Funktion augerufen wird, soll dieser gesendet werden u.s.w.
Aber trotzdem Danke.Grüße
Franky
-
dan nim doch ein stack, mache ihn thread sicher übergebe ihn an die Thread Funktion und die macht
for(;;) { while(!derStack.empty()) { SendeDenMist( derStack.top() ); derStack.pop(); } }
und in den andern Thread push du deine Buffer in den Stack
-
@Franky,
warum nicht so:
1. Thread starten
- einen Event erzeugen
- Thread mit Queue erstellen
- auf die Fertigstellung der Queue des Threads warten
- ...2. Thread-Funktion
- mit PeekMessage eine Queue zum Thread erstellen
- Event senden
- in Schleife eintreten:
( z.B. while((bRet = GetMessage(&msg, NULL, 0, 0)) != 0))
- wenn bRet <> -1 , dann WriteFile () aufrufen mit den in der Queue stehenden Zeichen/Puffer(n).Irgendein anderer Prozess/Thread sendet der Thread-Funktion per PostThreadMessage() dann alle Millisekunden die Daten in die Queue. Immer wenn Daten in der Thread-Queue drin sind, wird GetMessage die Schleife freigeben und WriteFile sie versenden.
Ob es JEDE Millisekunde geht - wahrscheinlich nicht. WinNT hat eine Timergranularität von ca. 5 ms, alle anderen von ca. 18 ms.Blackbird
-
Nochwas dazu:
Die Empfänger-ThreadID muß dem Datensender natürlich bekannt sein. Sie kann auch aus einem ganz anderem Prozess/Applikation stammen. Nur eben System-global sein. Z.B. über die Registry. PostThreadMessage ist schneller als SendMessage/PostMessage, da die Messages nicht in die normalen Windows-Callback-Routinen gelangen, sondern direkt zum Thread gehen.Blackbird