Problem mit Multithreading und MFC
-
hallo,
ich habe ein programm geschrieben, das daten via winsock erhalten soll und dann eine funktion mit den erhaltenen argumenten ausführen soll.das funktioniert auch soweit. doch solang die recv()-funktion auf daten wartet, reagiert das programm nicht. deshalb wollte ich mit multithreading arbeiten, sodass in dem thread die recv()-funktion ausgeführt wird. ich kann zwar dann eine statische funktion aufrufen, aber die kann dann die nicht-statische member-funktion nicht aufrufen. kann mir jemand sagen, wie ich das dann realisieren kann?danke, TSX
-
weiss nicht ob ich dich richtig verstehe, aber eine Lösung wäre folgende:
du speicherst dir den this Zeiger in einer statischen Variable, mit dieser kannst du dann in der static Methode über den -> auf die Variablen zugreifen.
-
ich verstehe deine lösung nicht so ganz. könntest du mir bitte ein code-fragment geben?
-
sofern die funktion die du aufrufen möchtest, in einer Windowsklasse ist, kannst du eine usermessage an das window schicken. ansonsten solltest du dich mit threadkommunikation (semaphores usw.) beschäftigen.
siehe http://www.codeproject.com/threads/#Threads
gruß
-
ich zeig mal lieber einen kleines stück vom code
// TestDlg.h : Headerdatei // #pragma once #include "afxwin.h" // CTestDlg-Dialogfeld class CTestDlg : public CDialog { // Konstruktion public: CTestDlg(CWnd* pParent = NULL); // Standardkonstruktor // Dialogfelddaten enum { IDD = IDD_TEST_DIALOG }; protected: virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV-Unterstützung // Implementierung protected: HICON m_hIcon; // Generierte Funktionen für die Meldungstabellen virtual BOOL OnInitDialog(); afx_msg void OnSysCommand(UINT nID, LPARAM lParam); afx_msg void OnPaint(); afx_msg HCURSOR OnQueryDragIcon(); DECLARE_MESSAGE_MAP() public: ... CWinThread* thread; void UseData(int i); static void GetData(LPVOID p); void StartThread(); };... void CTestDlg::GetData(LPVOID p) { TCHAR buf[256]; recv(socket,buf,256,0); UseData(atoi(buf); } void CTestDlg::UseData(int i) { TCHAR buf[256]; sprintf_s(buf,256,"Das Ergebnis ist %d",pow(2,i)); MessageBox(buf); return true; } void CTestDlg::StartThread() { thread=AfxBeginThread(GetData, this,THREAD_PRIORITY_NORMAL); }ich hoffe, das hilft beim verständnis
und vielen dank für die antworten

-
Du kannst keine Funktion von einem anderen Thread in deinem Thread aufrufen. das wird früher oder später knallen. versuch lieber die Daten über eine Message an deinen Dialog zu senden. (PostMessage oder SendMessage und usermessage) Dort kannst du dann die Daten weiterverarbeiten oder anzeigen oder was auch immer.
Des weiteren, wenn ich das richtig sehe läuft dein Thread einmal und beendet sich dann, so kannst du nur eine nachricht empfangen und schluß. im normalfall wird der Thread einmal gestartet und läuft so lange, so lange das hautprogramm nicht das beenden signalisiert.Gruß
-
dankeschön, mit SendMessage() funktioniert das von der sache her wunderbar
. jedoch nicht mit resourcen IDs, die größer sind als 255. woran liegt das ? und was kann man dagegen tun ?edit:
so habe ich SendMessage() benutzt:HWND wnd = 0; wnd = FindWindow(0, "Test"); SendMessage(wnd,WM_COMMAND,MAKEWORD(255,BN_CLICKED ), 0);ich gehe eigentlich davon aus, dass ich die funktion richtig benutze. aber ich poste das dennoch mal.
-
hey jungs ich wollte auch schon mit thread was machen, und was CTecS erzält ist das was ich mcahen möchte ! bin aber immer Fehlgeschlafen!
Ich hab quasie ein DatenObjekt mir diversen dAten.. dann möchte ich 2 thread einbauen die kontinunirlich oder in bestimmten intervall daten von diesem Objekt lesen und schreiben.. und das ja dann gleichzeitig!
Dann die Frage an CTecS:
kannst du mir evtl. ein ganz einfaches minmaler code schicken mit 2 thread die jeweis in ein datenobjekt schreiben bzw. lesen. und das in 500 ms abstädnen.. wäre echt dankbar für den gefallen.. mit thread hab ich meine problem.. würde das bei dir abschaun.. Danke
-
mehrere Thread benutzen:
die basis ist ein objekt, welches den schreib und lesezyklus regelt, ZB. mit CMutex. Jeder Thead nutzt dieses Objekt zum schreiben und lesen, und jeder Tread bekommt einen Zeiger auf dieses Objekt. Der/die Thread signalisieren dem Anzeige/Verarbeitungsthread das neue Daten vorhanden sind. Dies kann über eine Message WMUSER+1 im Falle einer Windows sein oder über eine andere Benachrichtigung (Siehe WaitForSingleObject). der Thread zur Anzeige zeigt die neuen Daten an und löscht diese aus dem Zwischenbuffer.
Das ist nur ein Ansatz wie es gehen kann, die Ausführung würde wahrscheinlich den Rahmen spengen. Wenn das jemand als Source Kompackt darstellen kann, dann soll er es machen.
Denke das ihr damit weiter kommt, theaads und teadsyncronisation ist ein thema für sich.
gruß
-
ich hab das jetzt mit der SendMessage() hinbekommen. ich musste einfach statt MAKEWORD() MAKELONG() benutzen.