Thread langsamer als Application->ProcessMessage!?



  • Hallo zusammen,

    in meinen Programm hab ich einen Teil in einen Thread ausgekoppelt. Das ganze läuft auch wunderbar. Allerdings ist es sehr viel langsamer im Vergleich zu vorher als ich in der for-Schleife noch mit Application->ProcessMessage gearbeitet hatte. Hab im Thread auch alles synchronisiert.

    Kennt jemand das Problem und vielleicht einen Lösungsansatz?

    Mfg
    Jack84

    PS.: Die Vorteile eines Threads sind mir bewusst, allerdings ist es in meinen Augen nicht tragbar, wenn ein Programm dadurch um etwa die Hälfte langsamer läuft.



  • Jack84 schrieb:

    Hab im Thread auch alles synchronisiert.

    definiere "Alles"...



  • Es ist der einzige Thread den ich in meiner Anwendung habe.
    Synchronisiert wird "Form->Update()".

    MfG
    Jack84



  • Wieso rufst du das Zeichnen des Forms synchron zum Thread auf? Da wunderts ja nciht weiter, wenn der Thread langsamer wird.



  • Erstmal Danke.
    Aber auch, wenn ich dieses nicht synchronisiere ist es trotzdem noch viel langsamer. Ich poste heute oder morgen den Code, den ich verwende.

    MfG
    Jack84



  • Hier der Code des Threads:

    [cpp]__fastcall TOpenThread::TOpenThread(bool CreateSuspended)
            : TThread(CreateSuspended)
    {
            Priority = tpTimeCritical;//es ist egal welche Priorität ich setze. Die Geschwindigkeit ist gleich.
            FreeOnTerminate = true;
    
    }[/cpp]
    

    Hier die Execute-Fkt (Habe es ein wenig gekürzt, aber das ist der witchtigste Teil):

    [cpp]for (int i=0;i<=LoadData->Count;i=i+9)//LoadData ist eine StrigList, die vorher eingelesen wurde.
            {
                    ListItem = Mainscreen->ListView1->Items->Add();
                    ListItem->Caption = LoadData->Strings[i];
                    ListItem->SubItems->Add(LoadData->Strings[i+1]);
                    ListItem->SubItems->Add(LoadData->Strings[i+2]);
                    ListItem->SubItems->Add(LoadData->Strings[i+3]);
                    ListItem->SubItems->Add(LoadData->Strings[i+4]);
                    ListItem->SubItems->Add(LoadData->Strings[i+5]);
                    ListItem->SubItems->Add(LoadData->Strings[i+6]);
                    ListItem->SubItems->Add(LoadData->Strings[i+7]);
                    ListItem->SubItems->Add(LoadData->Strings[i+8]);
                    if (Mainscreen->Abbruch == true)
                    {
                            Abort();
                    }
                    Synchronize(GuiElements);//auch ohne die Snychronisation bleibt die langsame Geschwindigkeit
            }[/cpp]
    

    Hier noch die Synchronisation:

    [cpp]void __fastcall TOpenThread::GuiElements()
    { 
            Mainscreen->Update();
    }
    [/cpp]
    

    Hoffe ihr könnt mir damit weiterhelfen.

    Gruß
    Jack84



  • Ob das Befüllen einer ListView aus einem Thread heraus sinnvoll ist, oder nicht, sei mal dahingestellt.
    Schau Dir mal TListItems::BeginUpdate() und ::EndUpdate() an...



  • Und abgesehen von Joe_Ms Hinweis (der übrigens mit ein Grund sein kann für langsame Verabreitung, weil das Listview sich bei jedem add neu zeichnen will, was zeit kostet) solltest du von TimeCritical alsPriorität für einen Thread eigentlich absehen. Oft reicht schon die Priorität "higher"... und selbstdie scheint mir für diese Aufgabe übertrieben...



  • @Joe_M.: Danke für den Tipp. Werds mir heut mittag näher anschauen.

    @junix: Die Priorität hat, wie ich ja schon geschrieben hatte, gar keine (erkennbare) Auswirkung auf die Geschwindigkeit. Hatte sie nur so hoch gesetzt, um zu testen, ob dadurch die Geschwindigkeit erhöht wird.

    Ich danke euch beiden aber schonmal für die schnelle Hilfe!!!

    Gruß
    Jack84


Anmelden zum Antworten