Threads in MFC

Hallo zusammen,

ich werde mal kurz schildern was ich gerne machen möchte. Also ich hebe mit MFC ein Programm geschrieben mit dem ich, mit einem USB-Device kommunizieren kann. Wenn ich bestimmte Funktionen aufrufe kann ich Daten vom Device empfangen die ich dann (erstmal) in einer Edit Box als String anzeige. Testweise führe ich diese Funktionsaufrufe jetzt aus wenn ein Button gedrückt wird. Allerdings sollte es so laufen das wenn der Button gedrückt wird, ein Thread startet der die Funktionen in einer Schleife abfragt und die Daten dann in der Edit Box anzeigt. Ich habe es mit AfxBeginThread() probiert, aber dann muss ich die Control-Funktion entweder als statische Member-Funktion oder nicht als Member-Funktion deklarieren. Das zieht nach sich das ich keine Zugriff mehr auf die Member-Variable der Edit Box habe und meine Daten nicht anzeigen kann. Ansich muss der Thread nur gestartet und gestoppt werden können. Weiterhin soll das Programm nicht noch andere Tätigkeiten verrichten…
Kann mir von Euch jemand weiterhelfen? Ich verzweifle schon…
Besten Dank im Voraus,
Hubert

Hallo!

Du könntest zwei Thread-Funktionen anlegen 1x statisch, 1x nichtstatisch. AfxBeginThread() übergibst Du beim Aufruf den this-Zeiger als Thread Parameter und die statische Funktion als Thread-Funktion.
Innerhalb der statischen Funktion kannst Du dann die nichtstatische Thread-Funktion über den this-Zeiger aufrufen (den mußt Du natürlich zuerst entsprechend casten).

Gruß Tobias

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Hallo Tobias!
Erstmal Danke für Deine Antwort! Habe es soweit ausprobiert und es gelingt mir die nicht statische Funktion durch die statische Thread-Funktion aufzurufen. Allerdings schmiert mir das Programm zur Laufzeit ab. Und zwar bei CDialog::UpdateData(FALSE). Wenn ich die Funktion von einer anderen Member-Funktion direkt aufrufe passiert das nicht und der Text wird angezeigt. Hast Du, oder jemand anders, ne Ahnung was da schief läuft?

void CUsbDlg::updateString()
{
m_MSP_DATA = „Test!!!“;
CDialog::UpdateData(FALSE);
}

UINT CUsbDlg::MyThreadProc(LPVOID pParam)
{
CUsbDlg* tst;
tst = (CUsbDlg*)pParam;
tst->updateString();
return 0;
}

Hallo Hubert!

Kleine Korrektur meines Vorschlags:
Anstatt des this-Zeigers übergibst du das Window-Handle deines Dialogs (m_hWnd).
Die Thread-Funktion müßte dann ungefähr folgendermaße aussehen:

CMyDlg MyDlg;
MyDlg.Attach((HWND)lpParameter);
MyDlg.DoSomething();
MyDlg.Detach();

return 0;

Gruß Tobias

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Hallo Tobias!

Danke für Deine Antwort! Habe es ausprobiert aber leider mit dem selben Ergebnis. Diesmal schmiert das Programm allerdings bei der Zeile MyDlg.Attach((HWND)lpParameter) ab. Hast Du noch irgend ne Idee? Hab meinen Code nochmal angehängt.
Gruß,
Hubert

void CUsbDlg::open_mouth:nButton1()
{
AfxBeginThread(MyThreadProc, m_hWnd);
}
UINT CUsbDlg::MyThreadProc(LPVOID pParam)
{

CUsbDlg myDlg;
myDlg.Attach((HWND)pParam);
myDlg.updateString();
myDlg.Detach();
return 0;

}

Hallo, wird mir jetzt auch nicht sofort klar…

… aber mit ::CreateThread(NULL, 0, ThreadProc, m_hWnd, 0, NULL); statt AfxBeginThread(…) hat’s bei mir funktioniert.

Gruß Tobias

Alternative: Wie wäre es mit einem Timer?
Hallo Hubert,

wieso setzt Du keinen Timer ein, dann kannst Du Dir die Thread-Programmierung sparen. Wenn der Button gedrückt wird, startest Du den Timer, der z.B. alle 50ms das USB-Device abfragt. Innerhalb der Timer-Nachrichtenfunktion kannst Du dann wie üblich direkt auf die Edit-Box zugreifen.

Gruß
Uwe

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Hallo Uwe!

Super! Danke!!! Das hat geklappt! Benutze den Timer und es funktioniert wunderbar!

Gruß,

Bert

Hi Tobias!
Habe es auch nochmal mit ::CreateThread(NULL, 0, ThreadProc, m_hWnd, 0, NULL); ausprobiert. Dabei bekam ich dann aber folgenden error:
error C2664: ‚CreateThread‘ : cannot convert parameter 3 from ‚unsigned int (void *)‘ to ‚unsigned long (__stdcall *)(void *)‘
None of the functions with this name in scope match the target type
Ich habe jetzt wie von Uwe vorgeschlagen eine Timer benutzt. Das funktioniert wunderbar. Falls Du allerdings am error erkennen kannst was ich falsch gemacht habe waere ich trotzdem interessiert zu wissen wie es richtig geht! Vielen Dank für Deine Hilfe!!!
Gruß,
Hubert

Hallo!
Wenn Du CreateThread verwendest muß die Thread-Funktion ein DWORD anstatt einem UINT zurückgeben.
Aber wenn ein Timer Deine Bedürfnisse ebenfalls erfüllt würde ich dabei bleiben, das ist mit Sicherheit unkomplizierter.
Gruß Tobias

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]