Anfängerprobleme mit Thread



  • Hallo!

    Ich wollte mir mal ein ganz einfaches Beispielprogramm für Threads schreiben, aber es stürzt immer wegen einer Zugriffsverletzung ab. Was mach ich denn falsch???

    static HANDLE     ErsterThreadFertig;
    DWORD id;
    HANDLE HandleThread1;
    
    DWORD WINAPI ErsterThread(LPVOID lpParam )
       {
       Form1->Edit1->Text = "Ich bin der erste Thread und tue 5 Sekunden nix";
       Sleep(5000);
       SetEvent(ErsterThreadFertig);
       return 0;
       }
    
    DWORD WINAPI ZweiterThread(LPVOID lpParam )
       {
       WaitForSingleObject(ErsterThreadFertig, INFINITE);
       Form1->Edit1->Text = "Ich bin der zweite Thread";
       return 0;
       }
    
    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
    
    HandleThread1 = CreateThread(NULL, 0, ErsterThread, NULL, 0, &id);
    if (HandleThread1 == NULL)
    {
    MessageBox( NULL, "", "Thread konnte nicht erzeugt werden.", MB_OK );
    return;
    }
    }
    


  • Also wenn ich das prog starte dann macht der erste threat fünf sekunden nix und der zweite startet gar nicht



  • Ja, so in Etwa... abgesehen davon wird ein Handle nicht NULL wenn was fehlschlägt sondern zu INVALID_HANDLE_VALUE. Wo tritt die Zugriffsverletzung auf? (->Debugger!)

    Ausserdem brauchst du dich hier nicht mit WinAPI zu quälen (->Hilfe: TThread) sondern kannst direkt VCL nehmen.

    Ahja, und was bitte ist WINAPI?

    -junix



  • Und was ich vergass: Wo sind die Aufrufe für CreateEvent, CloseHandle?

    Ahja und Variablen werden zu beginn immer erst initialisiert mit einem definierten Wert, Das erleichtert das Debuggen indem man Werte wiedererkennen kann im memorydump. Ausserdem weiss man dann ob man allenfalls vergessen hat etwas zu erstellen (wie z.B. ein Event.). Daher solltest du mind. die Handles mit INVALID_HANDLE_VALUE initialisieren.

    -junix



  • Oha, ich hab den zweiten Thread ja auch gar nicht gestartet 😮

    Aber ich wär ja schon froh, wenn der erste Thread 5 Sekunden nix tun würd. Das tut er bei mir nämlich nicht. 😞



  • Original erstellt von Winzler:
    Aber ich wär ja schon froh, wenn der erste Thread 5 Sekunden nix tun würd. Das tut er bei mir nämlich nicht. 😞

    Bis wo hin kommst du denn mit der Ausführung? Wird der Thread eröffnet?

    -junix



  • Danke für die Tipps schon mal.

    Also, der Thread wird noch eröffnet und der Fehler passiert dann bei

    Form1->Edit1->Text = "Ich bin der erste Thread und tue 5 Sekunden nix";
    

    Da kommt dann: Zugriffsverletzung bei 0x40064e25: Lesen von adresse 0xffffffff usw. 😕



  • Schau dir in der BCB Hilfe an was wegen Thread sicherheit unter TThread steht dann weisste ungefähr wo dein fehler ist.

    Warum benutzt Du winapi aufrufe ?
    Wie gesagt es gibt doch bereoits TThread, den du unter neu -> thread object erzeugen kannst

    Kleiner Tip noch :
    Wenn du einen Thread anlegst der bestimmte sachen machen soll baue ne while schleife ein die auf Terminated abfragt ( wenn du TThread benutzt )



  • Danke! Jetzt geht's.

    Die meisten Methoden, die auf ein VCL-Objekt zugreifen und ein Formular aktualisieren, dürfen nur vom VCL-Haupt-Thread aus aufgerufen werden

    Das scheint's gewesen zu sein.

    Der Grund, warum ich WinApi nehm: Ein Freund, der noch weniger Ahnung hat als ich, wollte wissen, wie das mit den Threads geht. Nur benutzt der Microsoft Visual C++. Und wenn ich das recht verstanden hab, dann ist VCL von Borland.



  • Jo das ist schon richtig VCL ist von Borland. Wobei die MFC (VC++) auch über eine ähnliche Klasse namens CWinThread verfügt.
    (wenn ich mich richtig erinnere)

    -junix


Anmelden zum Antworten