Forma tworzona przez wątek. O czym pamiętać?

0

Cześć, takich rzeczy jeszcze nie robiłem. Trochę googlowałem, ale znalazłem tylko jeden adekwatny post(tak mi się przynajmniej wydaje).

Otóż mam wątek. Ten wątek komunikuje się z usługą za pomocą socketów, czyli nie może być zbyt długo zajęty, bo musi odpowiadać. Okazało się, że wątek ten musi też utworzyć formę. I teraz pytanie, czy są jakeś rzeczy, o których muszę pamiętać robiąc taką konstrukcję? Czy wolno mi tworzyć formy modalne(showModal), żeby wątek nie stanął w miejscu? Czy tworzyć formy muszę w Synchronize? I czy w ogóle muszę używać synchronize w tym wypadku?

0

o czym pamiętać? - o tym, że się tak nie robi. To załatwi wszystkie możliwe problemy

0
Misiekd napisał(a)

o czym pamiętać? - o tym, że się tak nie robi. To załatwi wszystkie możliwe problemy

Robi, ort!, zrobić trzeba. Nie mogę tego w wątku głównym, bo może być zajęty, więc muszę w innym.

0

O ile wiem, to formularze nie są "thread safe", więc nie możesz zrobić tak jak to sobie wymyśliłeś. A dlaczego niby wątek musi tworzyć okno, nie wystarczy jak będzie przekazywać informacje do wątku głównego?

0
Juhas napisał(a)

... Nie mogę tego w wątku głównym, bo może być zajęty, więc muszę w innym...

To zaprojektuj aplikację od nowa, tym razem poprawnie.

b

0

nie wystarczy tylko utworzyć okna w innym wątku - wątek tworzący formatkę jest odpowiedzialny za obsługę kolejki komunikatów tego okna, a wiesz co to oznacza? że komunikaty nie będą spływać do silnika VCL i że (AFAIK) Application.ProcessMessages() w niczym nie pomoże, bo obsługuje kolejkę komunikatów tylko głównego wątku. przemyśl, czy na pewno chcesz zrobić tak jak myślisz, bo jak dla mnie jest to strzał w kolano. tak jak napisał b0bik: główny wątek jest od VCL (czyli jest Twórcą i Władcą Wszystkich Formatek), a do pracy służą dodatkowe wątki zlecające zmiany stanu kontrolek głównemu wątkowi (Synchronize()). można też dyskutować o synchronizowaniu dostępu do kontrolek pomiędzy wątkami - tak żeby żadne dwa nie zmieniały jednocześnie tej samej kontrolki - ale część zmian (np. repainty) leży poza dostępnym kodem i jest zawsze wykonywana przez wątek główny, więc wg mnie to też nie jest dobre rozwiązanie, bo nie ma jak synchronizować się z VCL.
ergo - zrefactoruj program według zasad ying-yang, w ten sposób łatwo rozwiążesz problem obecny i tuzin następnych.

@othello: thread-unsafe nie oznacza, że formularz nie może być utworzony w dowolnym wątku. problemy związane z asynchronicznym dostępem do obiektów powstają, kiedy DWA lub więcej wątki jednocześnie odwołują się do jednej zmiennej i co najmniej jeden z nich zapisuje. tu mamy jeden wątek - bo jeden wątek tworzy formatkę i ten sam jeden wątek obsługuje kolejkę komunikatów oraz zmienia stan kontrolek w tejże formatce. gdzie widzisz problem?

0
Juhas napisał(a)

Robi, ort!, zrobić trzeba. Nie mogę tego w wątku głównym, bo może być zajęty, więc muszę w innym.

poczytaj o message, czym się różni SendMessage od PostMessage i jak już bardzo musisz to idź w tym kierunku.
BTW możesz stworzyć formę w osobnym wątku ale nie delphiową TForm ale w winapi, z własną kolejką komunikatów

0

OK, już wiem wszystko, dzięki!

0

Utworz forme w Synchronize i wystarczy.

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