[BCB] komponent i watek

0

Witam. Wie moze ktos jak dynamicznie tworzyc komponenty VCL w watku ??
Probowalem tak:


DWORD WINAPI T_RECV(LPVOID lpParam)
{

while(1)
{

//.....

recv(Sock1, (char *)&Recv_Msg, sizeof(Recv_Msg), 0);
             int ktoTemp = Form1->szukaj_po_numerze(Recv_Msg.sender);
               if(ktoTemp != (-1))
               {
                   if(Form1->tablica_przyciskow[ktoTemp]->kno)//Jeżeli okno istnieje
                   {
                       ofstream plik ((ExtractFileDir(ParamStr(0))+ "\\Aktualne\\" + IntToStr(ktoTemp) + ".htm").c_str(),ios::app);
                       plik << "\n" << Recv_Msg.message;
                       plik.close();
                       Form1->tablica_przyciskow[ktoTemp]->komponenty_rozmowy.WebBrowser->Navigate(WideString(ExtractFileDir(ParamStr(0))+ "\\Aktualne\\" + IntToStr(ktoTemp) + ".htm").c_bstr(), 0, NULL, NULL, NULL);
                   }
                   else//Tworzenie okna
                   {
                     Form1->tablica_przyciskow[ktoTemp]->Forma = new TForm(Application);
   Form1->tablica_przyciskow[ktoTemp]->Forma->BorderStyle = bsSizeable;
   Form1->tablica_przyciskow[ktoTemp]->kno = true;
   Form1->tablica_przyciskow[ktoTemp]->Forma->Top = ((Screen->Height / 2) - Form1->tablica_przyciskow[ktoTemp]->Forma->Height / 2);
   Form1->tablica_przyciskow[ktoTemp]->Forma->Left = ((Screen->Width / 2) - Form1->tablica_przyciskow[ktoTemp]->Forma->Width / 2);
   Form1->tablica_przyciskow[ktoTemp]->Forma->Width = 300;
   Form1->tablica_przyciskow[ktoTemp]->Forma->Height = 300;
   Form1->tablica_przyciskow[ktoTemp]->Forma->Caption = Form1->tablica_przyciskow[ktoTemp]->numer_gg;
   Form1->tablica_przyciskow[ktoTemp]->Forma->Tag = Form1->tablica_przyciskow[ktoTemp]->Tag;
   Form1->tablica_przyciskow[ktoTemp]->Forma->Show();
}
//.....

}

}

Program sie kompiluje ale niestety zawiesza przy wykonaniu tego kodu. Wie ktos moze w czym problem, czemu dynamiczne tworzenie komponentow VCL w watku nie chce dzialac ??

0

czemu dynamiczne tworzenie komponentow VCL w watku nie chce dzialac ??

Inaczej: po co w wątku tworzyć okna???

0

bo jest mi to potrzebne porostu... w watku tym mam odbieranie pakietow od serwera gg no i jak ktos do mnie napisze (tzn bedzie nowa rozmowa) to musze utworzyc nowe okno rozmowy...

0

Ja się dołoże bo tworzymy to razem. Jeżeli nawet okno tworze w innej funkcji którą tylko wywołuje w wątku to i tak nie działa mimo że ta sama funkcja wywołana przez np wciśnięcie buttona działa. Coś może z synchronizacją nie tak albo nie wiem...

0

Problem w tym, że VCL nie jest przystosowany do pracy wielowątkowej więc najlepiej będzie jeżeli tworzenie okien i ich obsługa będzie odbywać się w wątku głównym. Najlepiej będzie jeżeli wątek zajmie się tylko odbiorem pakietów (thread safe FIFO), a głowny proces sprawdzaniem stanu i odpowiednią reakcją jeżeli np. jest jakaś wiadomość i trzeba ją wyświetlić (np. Timer).

0
0x666 napisał(a)

Problem w tym, że VCL nie jest przystosowany do pracy wielowątkowej
:O pierwsze slysze :|

a klasa TThread?

0
vixen03 napisał(a)

:O pierwsze slysze :|

a klasa TThread?

Hmm jedna klasa, a co z resztą??? Zapomniałeś chyba, że jest tam taka funkcja jak TThread::Synchronize, ciekawe po co? ;P

0

no chodzi mi o to, ze dzieki klasie TThread mozna zaimplementowac spokojnie wielowatkowosc uzywajac do tego VCLa.

nawet gdy trzeba wywolywac Synchronize co chwila ;)

0

Ja wiem o co Ci chodziło tyle, że ja nie o tym pisałem. To, że VCL umożliwia stworzenie wątku nie znaczy, że ów biblioteka jest thread safe - tak czy siak wymaga synchronizacji. Co do TThread::Synchronize to w pierwszym poście widać, że wątek jest tworzony funkcją CreateThread więc ten sposób synchronizacji na nic się nie zda ;)

0

Dlaczego formę tworzysz w ten sposób?

                     
Form1->tablica_przyciskow[ktoTemp]->Forma = new TForm(Application);
   Form1->tablica_przyciskow[ktoTemp]->Forma->BorderStyle = bsSizeable;
   Form1->tablica_przyciskow[ktoTemp]->kno = true;
   Form1->tablica_przyciskow[ktoTemp]->Forma->Top = ((Screen->Height / 2) - Form1->tablica_przyciskow[ktoTemp]->Forma->Height / 2);
   Form1->tablica_przyciskow[ktoTemp]->Forma->Left = ((Screen->Width / 2) - Form1->tablica_przyciskow[ktoTemp]->Forma->Width / 2);
   Form1->tablica_przyciskow[ktoTemp]->Forma->Width = 300;
   Form1->tablica_przyciskow[ktoTemp]->Forma->Height = 300;
   Form1->tablica_przyciskow[ktoTemp]->Forma->Caption = Form1->tablica_przyciskow[ktoTemp]->numer_gg;
   Form1->tablica_przyciskow[ktoTemp]->Forma->Tag = Form1->tablica_przyciskow[ktoTemp]->Tag;
   Form1->tablica_przyciskow[ktoTemp]->Forma->Show();

Zamiast zrobić ja wizualnie w Builderze.

I dlaczego wątek nie dziedziczy w TThread'a?

1 użytkowników online, w tym zalogowanych: 0, gości: 1