Thread und Update-Geschwindigkeit eines Dialogs
-
Hallo Leute,
ich habe eine FormView-Anwendung in der ich nur in einem CEdit Feld einen Wert
ausgebe.
Diesen Wert bekomme ich von einem HID und dort von einem Schieberegler.
Dieses HID frage ich in einem extra Thread ab.
Mein Problem ist nun, dass die Darstellung in der View sehr dem Betätigen
des Schiebereglers hinterher eilt.Hier meine Code-Fragmente:
ich erzeuge einen Thread:
m_MyThread = AfxBeginThread(MyThreadFunction, MyViewHWND ,THREAD_PRIORITY_NORMAL);in meiner FadenFunktion frage ich den HID ab und poste eine Message an
meine View:UINT MyThreadFunction(LPVOID pParam) { while (TRUE) { Result = ReadFile (...) //als Overlapped Aufruf verknüpft mit MyEvent //warten auf das Event der ReadFile Funktion Result = WaitForSingleObject (MyEvent, 10); switch (Result) { case WAIT_OBJECT_0: //wenn ein neuer Wert da war { //dann die Nachricht an meinen Dialog ::PostMessage((HWND) pParam, WM_MY_MESSAGE, 0, 0); break; } case WAIT_TIMEOUT: { Result = CancelIo(...); break; } default: { Result = CancelIo(...); break; } } ResetEvent(MyEvent); } }In meiner View behandle ich dann die Nachricht
in einer Methode.Mit den Thread Prioritäten habe ich schon experimentiert. Hatte aber
keinen Erfolg.Auch schreibe ich den Schieber-Wert noch in eine Variable,
die ich mit einer CriticalSection schütze.Ich hoffe jemand hat eine Idee, warum meine Ausgabe so nacheilt.
Vielen Dank!
pantau
-
ich hatte kürlich ein ähnliches problem..
Ich habe eine Datei kopiert in einem Thread und wollte den Forstschritte Ajtuakisieren im Dialog aber...Dieses Probkem löste indem ich meinem Thread nicht meine DateiObjekt übergabe sondern den Dialog selbst der auch die Objekte beinhaltet, in deinem Fall wenn deine FormView dein HID besitzt dann über dein FormView und rufe von Ihr PostMessage auf.
Bspl.
UINT CTCOPYDlg::CopyThread(LPVOID pParam) { CTCOPYDlg* pDlg = (CTCOPYDlg)pParam; pDlg->PostMessage(); }ich hoffe dies konnte dir weiterhelfen...
ich bin noch nicht so fortgeschritten...
-
für die grossen schreibfehler...
bin gerade etwas angeheitert....
-
Hallo T1c4L,
vielen Dank zuerst!
Dein Vorschlag brachte leider keine Verbesserung, aber er hat mich zu der Quelle des Übels gebracht:UNINT MyThreadFunction(LPVOID pParam) { while (true) { //als Overlapped implementiert Result = ReadFile(FileHandle1, &MyEvent1 ...); Result = WaitForSingleObject (MyEvent1, 0); if (Result == WAIT_OBJECT_0) PosteAnView(); else Result = CancelIo(FileHandle1); //als Overlapped implementiert Result = ReadFile(FileHandle2, &MyEvent2 ...); Result = WaitForSingleObject (MyEvent2, 0); if (Result == WAIT_OBJECT_0) PosteAnView(); else Result = CancelIo(FileHandle2); //Auskommentieren hilft } }Wenn ich in meiner Thread Funktion das zweite CancelIo(FileHandle2) auskommentiere wird meine Ausgabe in der View normal schnell. Wenn ich es drin lasse ist die Ausgabe nur im Schneckentempo. Leider brauche ich das zweite CancelIo natürlich, weil ich sonst nach einem TIME_OUT das zweite HANDLE nicht auslesen kann.
Ich bin echt ratlos und am Freitag will ich in Urlaub, da sollte ich eine Lösung haben
.Liebe Grüße
pantau
-
Hi alle zusammen,
Ich habe in meiner Anwendung was gemacht, was glaube ich nicht so gut ist:
Um zu sehen, ob das HID noch immer da ist, habe ich in der Schleife immer
HidD_GetInputReport(Handle, ByteArray, NumberOfBytes);
aufgerufen. Wenn ich das auskommentiere ist gut.
Ich kontrolliere jetzt ob das HID da ist mit der Message WM_DEVICECHANGE,
nachdem ich meine View dafür registriert habe (mit
RegisterDeviceNotification()).
Jetzt muß ich bei mir nur noch das Versions Durcheinader (VC++ 6.0, DDK von
2002)
auf meinem Rechner in Ordnung bringen. Ich kann das Programm nicht mit
meinem Compiler übersetzten,
ohne die Option /WINVER=0x0500 anzugeben.Und heute abend gehe in Urlaub!
Viele Grüße
Marcus Bleil