Frage zu Threads
-
Ascharan schrieb:
CodeFinder schrieb:
Des weiteren stehen im Inet auch noch sehr viele Beispiele... (allgemein zum Thema 'Threads')
Hoffe du meinst keine mfc beispiele davon hab ich tatsächlich ne menge gefunden sowie c# oder vb
Nein meine ich nicht...Beispiel: http://www.codeworx.org/cpp_tuts_1_5.php
Also ich finde da mehr als genug... Suchen muss schon schwer sein
.noha_39 schrieb:
wenn du mehr als nur einen Parameter übergeben willst helfen globale Strukturen, darüber kannst du dann auch den Threadstatus steuern
mfG nohaAuch da reicht eine übergebene Struktur (bzw. ein Zeiger darauf, achte allerdings auf die Gültigkeit dieses Zeigers!).
-
Luckie schrieb:
Warum schickst du mit SendMessage nicht die entsprechende Nachricht an die Fortschrittsanzeige?
Weil meine anwendung blockiert bis sie fertig is und das was ich am häufigsten gelesen habe is das man das problem mit hilfe von threads beheben kann,
@CodeFinder
und wie schwer 
-
Natürlcih sollst du die Nachricht aus dem Thread schicken.

Aber nicht zu oft, sonst ergibt ein Thread keinen Sinn mehr.
-
OK
-
Is das Falsch so, den der Thread startet mein Download
[cpp] RecieveThread = CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)InternetDownloadFile (GetDlgItem(hWnd,IDC_PROGRESS),GetDlgItem(hWnd, IDC_STATIC_TEXT), buffer_a, buffer_b),hWnd,0,&iID[1] ); SetRecieveStatus( RECIEVING );//Message meldung das Download Beendet is[/cpp]aber nach beendigung des Threads erzeugt er nen Fehler nur find ich den net beim erstellen der exe gibt es keine fehler und im debug verweist er auf
Unbehandelte Ausnahme bei 0x00000001 in MyTube.exe: 0xC0000005: Zugriffsverletzung beim Lesen an Position 0x00000001.
-
Meine Güte, was es alles an Fehlern gibt *g* (ist aber nicht böse gemeint
)...Aaaalso
...: Du rufst hier die Funktion 'InternetDownloadFile' auf, und konvertierst den Return-Wert mit einem C-Style-Cast in 'LPTHREAD_START_ROUTINE':(LPTHREAD_START_ROUTINE)InternetDownloadFile (GetDlgItem(hWnd,IDC_PROGRESS),GetDlgItem(hWnd, IDC_STATIC_TEXT), buffer_a, buffer_b)Du musst aber die Funktionsadresse übergeben, diese adressierte Funktion wird dann parallel ausgeführt. Falls Du mehrere Parameter übergeben willst (wie schon vorher angesprochen), musst Du einen Zeiger auf eine von Dir definierte Struktur übergeben (achte auf die Gültigkeit dieses Zeiger).
Bedenke: Wenn Du Speicher dynamisch im Hauptthread allokierst und darauf im Thread zugreifen willst, musst Du den Zugriff sychronisieren
.Hoffe mal, dass es das war
...
-
CodeFinder schrieb:
Meine Güte, was es alles an Fehlern gibt *g* (ist aber nicht böse gemeint
)...keine sorge versteh die threads eh noch net so denke da sind fehler erlaubt
, Meints du mit Funktionsadresse das in etwa so[cpp] typedef struct _MyDownloadData { HWND hwndProgress; HWND hwndStaticText; HINTERNET hOpen; CHAR *szUrl; CHAR *szFileName; } MyDownloadData, *PMyDownloadData; DWORD WINAPI MyDownloadThread(LPVOID lpParameter) { PMyDownloadData myData=(PMyDownloadData)lpParameter; // InternetDownloadFile aufrufen: InternetDownloadFile(myData->hwndProgress,myData->hwndStaticText,myData->hOpen,myData->szUrl, myData->szFileName); // Thread hat fertig: ExitThread(0); }[/cpp]wenn ja dann hät ich noch ne frage wie syncronisiere ich jetzt den thread

-
Joar die Definitionen sind korrekt. Aber im voherigen Post enthielt ja die Thread-Start Funktion Deinen Fehler, das wäre mal interessant zu sehen (also Aufruf von CreateThread).
Zum Theme Thread-Sychronisation:
- http://www.codeproject.com/threads/Synchronization.asp
- http://www.codeproject.com/threads/sync.aspPS: Du solltest anstelle von CreateThread lieber _beginthreadex verwenden (wegen möglicher interner Fehler bei Verwendung von CRT-Funktionen).
-
ok so starte ich den thread
[cpp] MyDownloadData threadData; threadData.hwndProgress=progress; threadData.hwndStaticText=stext; threadData.szUrl=buffer_a; threadData.szFileName=buffer_b; RecieveThread = CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)MyDownloadThread,&threadData,0,&iID ); [/cpp]hab von _beginthreadex gehört
nur kein blassen schimmer
aber werd mich mal einlesen
-
Hab da noch ne frage mein debuger sagt das der thread mit 0 beendet hat,
jedoch kann ich keinen weiteren thread starten unter dessen wie frage ich aus ich aus meinem Programm ab das er fertig is , hab schon mit[cpp] WaitForSingleObject(RecieveThread , INFINITE); [/cpp]versucht wie ,da bleibt aber mein programm hängen
-
Ascharan schrieb:
unter dessen wie frage ich aus ich aus meinem Programm ab das er fertig is , hab schon mit
[cpp] WaitForSingleObject(RecieveThread , INFINITE); [/cpp]versucht wie ,da bleibt aber mein programm hängen
Dan hat sich der Thread eben noch nicht beendet...
-
Jochen Kalmbach schrieb:
Ascharan schrieb:
unter dessen wie frage ich aus ich aus meinem Programm ab das er fertig is , hab schon mit
[cpp] WaitForSingleObject(RecieveThread , INFINITE); [/cpp]versucht wie ,da bleibt aber mein programm hängen
Dan hat sich der Thread eben noch nicht beendet...
laut debugger aber doch hier
Der Thread 'Win32 Thread' (0x144) hat mit Code 0 (0x0) geendet.
-
Dann war das eben ein anderer... oder hast Du verifiziert, dass die ThreadID stimmt?
Hast Du überhaupt das richtige Handle?
-
Hab doch in meinem Programm nur einen Thread wie kann man da das falsche Handle bzw. die Falsche ID Übergeben

-
Du hast mindestens zwei Threads in deinem Programm - in einem läuft dein Hauptprogramm, den zweiten hast du mit CreateThread angelegt. Weitere können unterwegs auch noch entstehen, wenn sie irgendwo hinter den Kulissen von Windows gebraucht werden (und die informieren dich dann genauso darüber, daß sie beendet wurden).
-
Wo is da der erste thread (die WinMain) oder ?
-
Ja, der erste Thread beginnt normalerweise mit der main()/WinMain() (das ist der Thread, den das WaitForSingleObject() ruhiggestellt hat).
-
aso nur hab ich auf den Zweiten thread verwiesen
WaitForSingleObject(RecieveThread , INFINITE);hab ja mit
HANDLE RecieveThread ;Das Handle erzeugt also sollte er ja eigentlich auf den thread zeigen den ich gestartet hab oder

-
Wenn du den Inhalt der Variablen nicht überschrieben hast, müsste dort noch die ID deines zweiten Threads drin stehen. Aber vermutlich war das nicht der "'Win32 Thread' (0x144)", der in den Trace-Ausgaben als beendet gemeldet wurde.
-
hm weis net, threads sind schwerer als ich dachte
