🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Thread View: pl.comp.os.linux.programowanie
3 messages
3 total messages Started by Łukasz Kowalczyk Mon, 13 Sep 1999 22:31
Qt, X-Window - wątki
#389
Author: Łukasz Kowalczyk
Date: Mon, 13 Sep 1999 22:31
25 lines
2016 bytes
Kiedyś wyczytałem gdzieś (możliwe, że w dokumentacji do Qt), że pod X nie
można pisać programów wielowątkowych. Jeżeli dobrze pamiętam, miało to
jakiś związek z globalną zmienną errno.

Na razie jedynym znanym mi sposobem pisania programów wielowątkowych w Qt
jest symulowanie wątków wydarzeniami generowanymi przez setTimer(), co
wygląda naprawdę idiotycznie.

Czy istnieją bardziej cywilizowane sposoby? Napisałem kilka programów
wielowątkowych w Javie, wszystkie pod X i zawsze musiałem pomagać wątkom
przez niezliczone wywołania Thread.yield(). Czy to właśnie manifestacja
przypadłości, na jaką cierpi X, czy akurat przypadkiem używałem JDK
implementującego wątki nie-sprzętowe?

Jeżeli tak ma wyglądać pisanie programów wielowątkowych w C++ to chyba jest 
mi prawie wszystko jedno - timer albo yield. A więc, jeszcze raz, jak
wygląda pisanie programów wielowątkowych pod X przy użyciu Qt?

PS. Jakby jeszcze ktoś wiedział, jak ma się to do interfejsu pyKDE
Qt<->Python to byłbym w czterdziestym drugim niebie ;)  Używam Qt 1.44
i pyKDE 0.8. (Chodzi mi o ewentualne problemy, których mogę się spodziewać).

-- 
Łukasz Kowalczyk
lukow<at>tempac.fuw.edu.pl              http://tempac.fuw.edu.pl/~lukow/
Re: Qt, X-Window - wątki
#390
Author: Andrzej Radecki
Date: Wed, 15 Sep 1999 14:55
62 lines
3823 bytes
Łukasz Kowalczyk <smithy@promail.pl> pisze:
>Kiedyś  wyczytałem gdzieś (możliwe, że w dokumentacji do Qt), że pod X nie
>można pisać programów wielowątkowych.

Nieprawda.

>Jeżeli dobrze pamiętam, miało to jakiś związek z globalną zmienną errno.

M.in.

>Na  razie jedynym znanym mi sposobem pisania programów wielowątkowych w Qt
>jest symulowanie wątków wydarzeniami  generowanymi  przez  setTimer(),  co
>wygląda naprawdę idiotycznie.

Największym  problemem  związanym  z używaniem wątków jest to, że większość
bibliotek  jest  "non-reentrant".  Oznacza  to,  że  nie  możesz  wywoływać
jednocześnie  jakichś tam funkcji z biblioteki z kilku wątków jednocześnie.
Nie wiem jak jest z Qt ale np. GTK jest właśnie taką  biblioteką  z  której
może  korzystać  tylko  jeden wątek. Jak sami się (chyba słusznie) tłumaczą
nakład pracy potrzebnej do uczynienia  biblioteki  "reentrant"  byłby  nie­
współmierny  do efektów zwłaszcza, że można poradzić sobie bez tego. Są dwa
(a może więcej) rozwiązania tego problemu:

1.  Zlecasz  jednemu  (głównemu?)  wątkowi  realizację wszelkich odwołań do
funkcji bibliotecznych. W wątkach zamiast  wywołania  funkcji  przekazujesz
odpowiednie  dane  głównemu  procesowi  i czekasz aż ten zrobi co powinien.
Dobrze jest tu wykorzystać jakiś systemowy mechanizm synchronizacji  (mute­
xy,  rurkę  itp.)  tak  aby  proces czekając na wynik oddawał sterowanie do
systemu.

2.  "Okładasz" funkcje biblioteczne, z których będziesz w wątkach korzystał
semaforami. Tworzysz w ten sposób  własne  bezpieczne  funkcje  i  _zawsze_
używasz  tylko nich. Musisz uważać na inne funkcje biblioteczne, które mogą
się odwoływać funkcji, których używasz w wątkach - je  też  musisz  obłożyć
semaforami.  (chociaż  tu  nie  jestem  pewien - może  okazać się konieczne
"obłożenie" semaforem wszystkich funkcji w bibliotece.. Brr..)

Jeśli  postąpisz wg. jednej z tych metod to nie ma przeszkód aby nie używać
wątków. Musisz tylko bardzo uważać na to jakie funkcje  wywołujesz  bo  jak
sknocisz to będzie się sypało aż miło. Ogólnie jeśli chcesz w wątku wywołać
jedną lub dwie charakterystyczne funkcje biblioteczne (tj. takie które  nie
są  używane  w  każdej innej gunkcji bibliotecznej) to skorzystaj z drugiej
opcji - jeśli tych funkcji jest dużo lub używa ich wiele innych funkcji  to
lepiej użyj metody pierwszej.

Jeśli  chcesz się dowiedzieć w ilu miejscach biblioteki jest wykorzystywana
dana funkcja możesz zdisassemblować tą bibliotekę moim programikiem:

http://www.wpk.p.lodz.pl/~radecki/disasm.tar.gz

Nie  zadziała  on  niestety dla funkcji wirtualnych - pokaże 0 odwołań. Ale
taki jest urok funkcji wirtualnych (i zmiennych dynamicznych też).

Co  do  wpomnianej zmiennej "errno". Akurat glibc ma możliwość przełączenia
się w tryb pracy "wielodostępnej".  W  tym  celu  możesz  skompilować  swój
program z "-D_REENTRANT" i używać funkcji glibca ile chcesz i gdzie chcesz.

Pozdrawiam,
-- 
(    /6/  Andrzej Radecki
 ====  \  radecki@wpk.p.lodz.pl
/   |     http://www.wpk.p.lodz.pl/~radecki
Re: Qt, X-Window - wątki
#391
Author: Łukasz Kowalczyk
Date: Thu, 16 Sep 1999 22:11
18 lines
1434 bytes
[ Andrzej Radecki ]
> >Kiedyś  wyczytałem gdzieś (możliwe, że w dokumentacji do Qt), że pod X nie
> >można pisać programów wielowątkowych.
> 
> Nieprawda.

To mnie ucieszyłeś.

[ ciach - dużo i mądrze ]

Mam jeszcze jedno pytanie, choć właściwie znam odpowiedź, jednak tonący
różnych rzeczy się chwyta: czy Qt ma jakieś mechanizmy wspomagające
wątkowanie? Coś na kształt Thread w Javie, być może są jakieś third-party
klasy rozszerzające?

-- 
Łukasz Kowalczyk
lukow<at>tempac.fuw.edu.pl              http://tempac.fuw.edu.pl/~lukow/
Thread Navigation

This is a paginated view of messages in the thread with full content displayed inline.

Messages are displayed in chronological order, with the original post highlighted in green.

Use pagination controls to navigate through all messages in large threads.

Back to All Threads