CYFROWY BARON • PROGRAMOWANIE • Zobacz wątek - [BCB C++ watki i Synchronize VCL do innej klasy

[BCB C++ watki i Synchronize VCL do innej klasy

dział ogólny

[BCB C++ watki i Synchronize VCL do innej klasy

Nowy postprzez Darek_C++ » niedziela, 1 lipca 2012, 18:38

Witam ponownie,

Jeśli w wątku odwołujemy sie do komponentu VCL np TMemo musi to być w metodzie TThread::Synchronize()
KOD cpp:     UKRYJ  
void __fastcall WatekPrzeszukujacy::Execute()
{
    // Jakieś operacje wykonywane w ramach wątku....
    //Informacja zwrotna do okna programu        w metodzie synchronize
    Synchronize(&PobierzStop);
}
// Sposob 1
void __fastcall WatekPrzeszukujacy::PobierzStop()
{
        Memo->Lines->Add("jakies dane do wstawienia...");
}
/// Sposob 2
void __fastcall WatekPrzeszukujacy::PobierzStop()
{
        ParsujDane Parsuj;
        Parsuj.LinkiDoMemo(Memo, sKodHtml);
}
Moje pytanie brzmi czy w sposobie nr 2 w której przekazuje wskaźnik do TMemo do innej kasy i dopiero w niej odbywają się operacje na TMemo jak wstawienie danych, ale odbywa się to nadal w metodzie w ramach Synchronize() będzie prawidłowe pod względem synchronizacji z wątkiem głównym :)
Ostatnio edytowano niedziela, 1 lipca 2012, 19:39 przez Darek_C++, łącznie edytowano 1 raz
Avatar użytkownika
Darek_C++
Elektrowied
Elektrowied
 
Posty: 454
Dołączył(a): piątek, 25 lipca 2008, 14:33
Podziękował : 66
Otrzymał podziękowań: 4
System operacyjny: Windows XP Pro SP2
Kompilator: Turbo Explorer C++
Gadu Gadu: 0
    Windows XPFirefox

Re: [BCB C++ watki i Synchronize VCL do innej klasy

Nowy postprzez polymorphism » niedziela, 1 lipca 2012, 19:39

Czy dobrze rozumiem, że przykładowa metoda LinkiDoMemo klasy ParsujDane wywoływana w ten sposób jak w tym przykładzie nie jest wykonywana w ramach wątku który ja wywołał ?

Tak. Synchronize oddelegowuje wykonanie metody do wątku głównego aplikacji (dlatego bezpieczne jest odwoływanie się do kontrolek VCL).
C++ Reference - opis wszystkich klas STL-a i funkcji C.

Za ten post autor polymorphism otrzymał podziękowanie od:
Darek_C++
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2157
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 19
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    Windows XPFirefox

Re: [BCB C++ watki i Synchronize VCL do innej klasy

Nowy postprzez Darek_C++ » niedziela, 1 lipca 2012, 19:41

Czyli mogę tak zrobić jak w tym sposobie Sposob 2 ?
Pomijając to, że ParsujDane powinno być gdyby było czasochłonne jednak w metodzie Execute() wywoływane :)
Avatar użytkownika
Darek_C++
Elektrowied
Elektrowied
 
Posty: 454
Dołączył(a): piątek, 25 lipca 2008, 14:33
Podziękował : 66
Otrzymał podziękowań: 4
System operacyjny: Windows XP Pro SP2
Kompilator: Turbo Explorer C++
Gadu Gadu: 0
    Windows XPFirefox

Re: [BCB C++ watki i Synchronize VCL do innej klasy

Nowy postprzez polymorphism » niedziela, 1 lipca 2012, 19:44

Tak.
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2157
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 19
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    Windows XPFirefox

Re: [BCB C++ watki i Synchronize VCL do innej klasy

Nowy postprzez Darek_C++ » poniedziałek, 26 sierpnia 2013, 15:07

Witam ponownie po przerwie i chciał bym powrócić do tematu wątku i komponentów wizualnych VCL.
Kwestia jest następująca - "do wątku" przekazuje wskaźnik na TListView który to zawieraj np kolumnę [Adresy URL] do wykonania na nich operacji i kolumnę [Status Operacji] która jak sama nazwa wskazuje ma pokazywać na bieżąco status operacji jak logowanie, wyszukiwanie, dodawanie itd,,,
Sprawa jest prosta jak dane czasochłonne operacji wykonywane były bezpośrednio w metodzie MyWatek::Execute() wtedy mogę użyć metody Synchronize
KOD cpp:     UKRYJ  
// Wywolanie watku z Formy Glownej programu
Watek = new MyWatek(true);
Watek->WT_ListView1 = ListView1;
Watek->OnTerminate = MyOnTerminate;
Watek->Resume();

KOD cpp:     UKRYJ  
// Watek roboczy MyWatek
void __fastcall MyWatek::Execute()
{
        this->sKomunikat="Start";
        Synchronize(&KomunikatZwrotny);
        Sleep(RandomRange(5000, 10000));

        this->sKomunikat="Pobieram";
        Synchronize(&KomunikatZwrotny);
        Sleep(RandomRange(5000, 10000));

        this->sKomunikat="Operacja 1";
        Synchronize(&KomunikatZwrotny);
       Sleep(RandomRange(5000, 10000));

        ///itd.... co symuluje czasowe operacje wykonywane w metodzie Execute() watku
}

void __fastcall MyWatek::KomunikatZwrotny()
{
        WT_ListView1->Items->Item[this->tuNrNaList]->SubItems->Strings[0] = this->sKomunikat
}


Wersja z klasą roboczą wywoływaną w wątku:
KOD cpp:     UKRYJ  
/// WERSJA DRUGA Z KLASA OBSLUGI OPERACJI WYWOLYWANA W WATKU

void __fastcall MyWatek::Execute()
{
        KlasaRobocza * DoKlasaRobocza = new KlasaRobocza();
        DoKlasaRobocza->KL_ListView1 = WT_ListView1;
        DoKlasaRobocza->KL_NrNaList = tuNrNaList;
        DoKlasaRobocza->WykonujOperacje();
        delete DoKlasaRobocza; KlasaRobocza  = NULL;
}

// W klasie roboczej mamy metode
void __fastcall KlasaRobocza::WykonujOperacje()
{
        KL_ListView1->Items->Item[this->KL_NrNaList]->SubItems->Strings[0] = "Start";  
        Sleep(RandomRange(5000, 10000));
       
        KL_ListView1->Items->Item[this->KL_NrNaList]->SubItems->Strings[0] ="Pobieram";
        Sleep(RandomRange(5000, 10000));
       
        KL_ListView1->Items->Item[this->KL_NrNaList]->SubItems->Strings[0] ="Operacja 1";
        Sleep(RandomRange(5000, 10000));

        ///itd.... co symuluje czasowe operacje wykonywane w metodzie WykonujOperacje
}
Te komunikaty sie pojawiają w ListView i porgram się nie wysypuje (choć wątków działa wiele naraz), ale jak sadzę nie ma tu żadnej synchronizacji.
Jak to zrobić prawidłowo Czyli jak zablokować na chwilę dostęp dp VCL ListView by mógł tylko jedne watek -> KlasaRobocza w nim wywolywa odwołać się do ListView ?
-----
Podsumowując chodzi o to żeby był jeden wątek który w zależności od zadania do wykonania wywoływał rożne "klasy robocze"w metodzie Execute() i by klasy robocze mogły "wypisywać" na bieżąco status wykonywanej operacji w TListView, a nie tylko po zakończeni komunikat zwrotny.
Avatar użytkownika
Darek_C++
Elektrowied
Elektrowied
 
Posty: 454
Dołączył(a): piątek, 25 lipca 2008, 14:33
Podziękował : 66
Otrzymał podziękowań: 4
System operacyjny: Windows XP Pro SP2
Kompilator: Turbo Explorer C++
Gadu Gadu: 0
    Windows XPFirefox

Re: [BCB C++ watki i Synchronize VCL do innej klasy

Nowy postprzez polymorphism » poniedziałek, 26 sierpnia 2013, 17:31

Jeśli TListView nie jest przystosowany do pracy wielowątkowej, to w praktyce nie zsynchronizujesz dostępu do niego. Po to masz metodę Synchronize, żebyś mógł bezpiecznie odwoływać się do kontrolek VCL.
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2157
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 19
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    Windows XPFirefox

Re: [BCB C++ watki i Synchronize VCL do innej klasy

Nowy postprzez Darek_C++ » poniedziałek, 26 sierpnia 2013, 17:49

polymorphism napisał(a):Jeśli TListView nie jest przystosowany do pracy wielowątkowej
Zatem czy można sprawdzić czy jest /nie jest dany komponent VCL przystosowany do takiej pracy ?
Avatar użytkownika
Darek_C++
Elektrowied
Elektrowied
 
Posty: 454
Dołączył(a): piątek, 25 lipca 2008, 14:33
Podziękował : 66
Otrzymał podziękowań: 4
System operacyjny: Windows XP Pro SP2
Kompilator: Turbo Explorer C++
Gadu Gadu: 0
    Windows XPFirefox

Re: [BCB C++ watki i Synchronize VCL do innej klasy

Nowy postprzez polymorphism » poniedziałek, 26 sierpnia 2013, 17:55

Zapewne gdzieś w dokumentacji jest to napisane. Ale jeśli nic się nie zmieniło, to kontrolki VCL nie są przystosowane do pracy wielowątkowej.
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2157
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 19
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    Windows XPFirefox

Re: [BCB C++ watki i Synchronize VCL do innej klasy

Nowy postprzez Darek_C++ » poniedziałek, 26 sierpnia 2013, 18:01

A blokada mutexem w chwili update kontroli i zwolnienie po wpisaniu do niej ?
Avatar użytkownika
Darek_C++
Elektrowied
Elektrowied
 
Posty: 454
Dołączył(a): piątek, 25 lipca 2008, 14:33
Podziękował : 66
Otrzymał podziękowań: 4
System operacyjny: Windows XP Pro SP2
Kompilator: Turbo Explorer C++
Gadu Gadu: 0
    Windows XPFirefox

Re: [BCB C++ watki i Synchronize VCL do innej klasy

Nowy postprzez polymorphism » poniedziałek, 26 sierpnia 2013, 18:25

Musiałbyś w ten sposób potraktować każde odwołanie do kontrolki, wtedy będziesz miał zsynchronizowany dostęp - tyle teoria. W praktyce musiałbyś także zsynchronizować obsługę komunikatów docierających do tej kontrolki - i tu, być może, jest problem. W wxWidgets są funkcję, które umożliwiają synchronizację z pętlą komunikatów, co w niektórych(!!!) przypadkach załatwia sprawę synchronizacji. Być może coś takiego jest w VCL (przeglądałem pobieżnie dokumentację, ale nic nie znalazłem). Generalnie warto się trzymać zasady, że wątki nie powinny bezpośrednio odwoływać się do elementów GUI, od tego masz Synchronize lub timer.
C++ Reference - opis wszystkich klas STL-a i funkcji C.

Za ten post autor polymorphism otrzymał podziękowanie od:
Darek_C++
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2157
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 19
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    Windows XPFirefox


  • Podobne tematy
    Odpowiedzi
    Wyświetlone
    Ostatni post

Powrót do Ogólne problemy z programowaniem

Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zalogowanych użytkowników i 9 gości

cron