Programmierung meherer Prozesse (Threads)



  • Hallo.

    Ich möchte gern die Möglichkeiten der Threadprogrammierung im Borland C++ für die Online-Grafikausgabe meiner Messdaten benutzen. Ich habe versucht einen Testthread zu schreiben, aber irgendwie arbeitet Borland C++ erst mein Hauptprogramm ab und danach meinen zuvor mit Resume angeschalteten Thread - Arbeitet als immernoch sequentiell. Ich bräuchte Informationen zur Programmierung von Threads - entweder per Forum, oder mit einem Tipp eines Buches :-). Die Hilfe beschreibt zwar den Aufbau etc. aber ein kleines Beispiel wäre echt super.

    Vielen Dank



  • Dieser Thread wurde von Moderator/in HumeSikkins aus dem Forum C++ in das Forum Rund um die Programmierung verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • Erstens: Falsches Forum, ein Mod wird den Thread aber wohl bald verschieben.
    €Ich glaube das sollte eher ins BCB-Forum?
    Zweitens:
    Vielleicht kannst du uns mal ein bissel Code zeigen?

    So sieht bei mir das Grundgerüst eins Threads aus:

    #include <vcl.h>
    #pragma hdrstop
    #include "Unit2.h"
    #pragma package(smart_init)
    //---------------------------------------------------------------------------
    __fastcall TMyThread::TMyThread(bool CreateSuspended): TThread(CreateSuspended)
    {
    }
    //---------------------------------------------------------------------------
    void __fastcall TMyThread::Execute()
    {
     while(!Terminated)
     {  
      // ---- Hier fügen Sie den Quelltext ein ----
      Sleep(100);
     }
    }
    //---------------------------------------------------------------------------
    


  • Also bei mir sieht der Thread genauso aus. In der Execute rufe ich die Synchronize Funktion auf und die gleicht die Funktion UpdataProc ab. Nun ist das Problem, dass ich während des Abgleichs (Schreiben ins Caption von Form1) nichts anderes machen kann. Selbst das Formfeld lässt sich nicht bewegen. Ergo - sequentielles Abarbeiten und nicht paralleles.
    Was mache ich falsch? Muss ich noch irgendwelche Attribute setzen? Ich habe dieses Testbeispiel geschrieben, da es sich sehr dem Problem der Onlinegrafikanzeige ähnelt, aber schneller zu programmieren ging.

    extern TForm *Form1;
    __fastcall ParThread::ParThread(bool CreateSuspended)
    : TThread(CreateSuspended)
    {
    // Priority = tpNormal;
    }
    //---------------------------------------------------------------------------
    void __fastcall ParThread::Execute()
    {
    while (!Terminated)
    {
    Synchronize(UpdateProc);
    Suspend();
    }
    }
    //---------------------------------------------------------------------------
    void __fastcall ParThread::UpdateProc()
    {

    while (l < 100)
    {
    Form1->Caption = "Die Variable hat den Wert: "+IntToStr(l);
    l++;
    Sleep(5);
    if (Terminated) return;
    }
    }
    //---------------------------------------------------------------------------



  • 1. Bitte CODE oder CPP Tags benutzen, danke
    2.

    Beschreibung

    Synchronize löst den Aufruf einer bestimmten Methode aus, die vom VCL-Haupt-Thread ausgeführt werden soll. Durch dieses indirekte Verfahren werden Konflikte in Multithread-Anwendungen vermieden. Wenn Sie nicht sicher sind, ob ein Methodenaufruf Thread-sicher ist, rufen Sie die Methode aus Synchronize heraus auf.

    Der Thread wird unterbrochen, während die angegebene Methode ausgeführt wird.

    (Hervorhebung von mir)

    Mögliche Lösung, könnte bessere geben:

    Berechnung und Form interaktion in seperaten Funktionen.Nur Form interaktion über Synchronize.Parameter können über Private-Variablen des Threads übergeben werden.



  • Super! Vielen Dank. Jetzt hab ichs verstanden - und funktionieren tuts auch 😋

    __fastcall ParThread::ParThread(bool CreateSuspended)
            : TThread(CreateSuspended)
    {
      Priority = tpNormal;
      l = 0;
    }
    //---------------------------------------------------------------------------
    void __fastcall ParThread::Execute()
    {
      while (!Terminated)
      {
        DecVar();
        Synchronize(UpdateProc);
        //Suspend();
      }
    }
    //---------------------------------------------------------------------------
    void __fastcall ParThread::UpdateProc()
    {
      Form1->Caption = "Die Variable hat den Wert: "+IntToStr(l);
    }
    //---------------------------------------------------------------------------
    void  ParThread::DecVar()
    {
      l++;
      Sleep(5);
    }
    


  • Kein Problem 🙂

    Also immer dran denken: Synchronize ist so als ob man die Funktion direkt im Hauptthread ausführt und somit ist ein Thread der nur ein Synchronize aufruft nuzulos. ⚠



  • Dieser Thread wurde von Moderator/in kingruedi aus dem Forum Rund um die Programmierung in das Forum VCL/CLX (Borland C++ Builder) verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • Du hast ein grundlegenderes Problem: Frag dich mal selber ob wirlich bei jeder Berechnung ein Update der Grafik nötig ist?Bedenke: der Mensch sieht grade mal bis zu 50fps. Was drüber liegt sieht er nicht mehr. Vielleicht wäre eine passendere Architektur, dass du im Thread die Daten berechnest, sie in einen Puffer schiebst, und die Anzeige sich bei einem Festgelegten UPdate (die Erfahrung zeigt, dass oftmals 2Hz Updaterate mehr als ausreichend sind = alle 500ms ein Update) die Daten aus dem PUffer zieht. ICh persönlich halte es im Allgemeinen für schlehten Stil direkt im Thread auf irgendwelchen GUI-Elementen rumzuzeichnen. Das bremst den Thread nur unnötig aus, da das Zeichnen auf GUI-Elementen (dazu gehörtauch Zuweisen von Text, etc. ) aus THreadsicht ewig + 3 Tage dauert...


Anmelden zum Antworten