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
Author: Łukasz Kowalczyk
Date: Mon, 13 Sep 1999 22:31
Date: Mon, 13 Sep 1999 22:31
25 lines
2016 bytes
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
Author: Andrzej Radecki
Date: Wed, 15 Sep 1999 14:55
Date: Wed, 15 Sep 1999 14:55
62 lines
3823 bytes
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
Author: Łukasz Kowalczyk
Date: Thu, 16 Sep 1999 22:11
Date: Thu, 16 Sep 1999 22:11
18 lines
1434 bytes
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