Threadparameter ohen Pointer übergeben?
-
Hallo,
kann ich einen ThreadParameter ohne pointer übergeben, also ohne
den ThreadParameter mit new zu initialisieren??So hab ich gedacht:
// ThreadParam pThreadParam = new ThreadParam;// so ist jetzt, und es funktioniert so! ThreadParam pThreadParam; // so möchte ich es haben!! CWinThread* pThread = AfxBeginThread(threadproc, pThreadParam, THREAD_PRIORITY_NORMAL); if(NULL == pThread) { AfxMessageBox(L"Fehler bei blabla..."); return 0; } // wenn ich jetzt die threadproc aufrufe ist der parameter leer! UINT threadproc(LPVOID lParam) { // pTheadParam ist leer!!! ThreadParam* pThreadParam = (ThreadParam*)lParam; .... ....wie kann ich das machen das ich einen Parameter ohne Pointer übergebe, wenn es überhaupt möglich ist??

lg
pixel
-
pixel schrieb:
wie kann ich das machen das ich einen Parameter ohne Pointer übergebe, wenn es überhaupt möglich ist??
hi,
so ein threadparam kann ein beliebiger 32bit wert sein, z.b. ein pointer, ein wert (0 in deinem beispiel), dein geburtstag in sekunden ab dem 1.1.1970, deine initialen (mit punkten!) usw...usw...
-
Hallo net,
in meinen Beitrg ist ein kleiner Fehler, ich hab nicht alles ganz richtig
vollständig geschriben, der Parameter ist eine Struktur, und kein einzelner
Wert, mit einzelnen werten hab ich keine Probleme gehabt!nochmal:
// in .h typedef struct CThreadParams{ CMyDlg* pDlg; CString csFilePath; HANDLE m_hStopThread; HANDLE m_hWaitThread; }ThreadParams,*PThreadParams; // weiter wie vorher beschrieben: // wenn /* ThreadParam* pThreadParam = new ThreadParam; pThreadParam->csFilePath = csNewFilePath; pThreadParam->pDlg = this; so funktioniert es! */ ThreadParam pThreadParam; pThreadParam.csFilePath = csNewFilePath; pThreadParam.pDlg = this; CWinThread* pThread = AfxBeginThread(threadproc, pThreadParam, THREAD_PRIORITY_NORMAL); if(NULL == pThread) { AfxMessageBox(L"Fehler bei blabla..."); return 0; } // wenn ich jetzt die threadproc aufrufe ist der parameter leer! UINT threadproc(LPVOID lParam) { // pTheadParam ist leer, genau gesagt pThreadParam->csFilePath ist leer!!! ThreadParam* pThreadParam = (ThreadParam*)lParam; .... ....grüsse
pixel
-
pixel schrieb:
ThreadParam pThreadParam; pThreadParam.csFilePath = csNewFilePath; pThreadParam.pDlg = this; CWinThread* pThread = AfxBeginThread(threadproc, &pThreadParam, THREAD_PRIORITY_NORMAL);Du musst dem Thread die Adresse auf deine ThreadParam Instanz übergeben (siehe '&' bei AfxBeginThread()).
-
Der Übergabeparameter darf aber keine lokale Variable sein, da ansonsten der Wert schon wieder im Stack überschrieben sein könnte, wenn die Threadfunktion darauf zugreift (wenn die aufrufende Funktion danach einfach wieder beendet wird).
-
Hallo Chris,
das hab ich auch schon probiert, leider steht dann in
csNewFilePath nur ein Zeichen drin, und das kann ich auch nicht sagen was für eins!

irgend ein komisches Γ, vielleicht hab ich die konvertierung nicht richtig gemacht????ThreadParam pParam = (ThreadParam&) lParam;lg
pixel
-
Sorry, hatte die Konvertierung nach LPVOID vergessen.
CWinThread* pThread = AfxBeginThread(threadproc, (LPVOID)(&pThreadParam), THREAD_PRIORITY_NORMAL);Vieleicht geht hier auch static_cast (hab aber gerade kein miniprogram zum testen dabei).
pixel schrieb:
das hab ich auch schon probiert, leider steht dann in
csNewFilePath nur ein Zeichen drin, und das kann ich auch nicht sagen was für eins!Ähm, da weis ich jetzt auch nicht woran das liegen könnte (ich tippe mal das es an "ThreadParam pParam = (ThreadParam&) lParam;" liegen wird).
Im Thread müsstest du dann noch folgendes machen:
ThreadParam* pParam = (ThreadParam*) lParam;
-
das funzt so nicht. was vorher kein pointer war, wird durch casting auch nicht zum pointer.
-
net schrieb:
das funzt so nicht. was vorher kein pointer war, wird durch casting auch nicht zum pointer.
Wenn du die Adresse der Struktur (&pThreadParam) an den Thread übergibst, dann ist das doch ein Pointer. Musst den dann nur wieder in eine ThreadParam-Adresse zurück casten.
ThreadParam pThreadParam; pThreadParam.csFilePath = csNewFilePath; pThreadParam.pDlg = this; CWinThread* pThread = AfxBeginThread(threadproc, (LPVOID)(&pThreadParam), THREAD_PRIORITY_NORMAL); UINT threadproc(LPVOID lparam) { ThreadParam* pParam = (ThreadParam*) lParam; }Edit: Beispielcode hinzugefügt.
-
siehe auch:
http://www.se.fh-heilbronn.de/usefulstuff/VCPLUS6/kap18.htm
http://www.henkessoft.de/C++/MFC/mfc_einsteigerbuch_kapitel17.htm