Multi-Thread-Anwendung und XInitThreads

Für Fehler in Lazarus, um diese von anderen verifizieren zu lassen.
Antworten
Bergmann89
Beiträge: 98
Registriert: Di 15. Nov 2011, 11:36

Multi-Thread-Anwendung und XInitThreads

Beitrag von Bergmann89 »

Hey Leute,

ich hab ein komisches Problem bei dem ich nicht weiter weiß. Ich hab eine normale Anwendung die einige rechenintensive Routinen in extra Threads auslagert. Auf Windows fgunctionniert alles ohne Probleme doch unter Linux (64bit) schmiert die Anwendung ohne Fehler ab. Wenn ich ddas Programm in der Console starte bekomm ich folgende Meldung:

Code: Alles auswählen

[xcb] Unknown sequence number while processing reply
[xcb] Most likely this is a multi-threaded client and XInitThreads has not been called
[xcb] Aborting, sorry about that.

Ich hab dazu auch schon ein paar Topics bei google gefunden, aber keins von denen hatte ne Lösung parat. Die einen sagen ich muss XInitThread aus der xlib aufrufen, doch wenn ich das mach schmieren mir die Ciritical Sections aus der pthread-Unit weg. Andere sagen ich muss einfach die cthread-Unit in die uses aufnehmen, doch die ist schon drin und wird auch genutzt. Wo also soll ich noch nach einer Lösung suchen? Hat von euch jmd ne Ahnung was ich gegen das Problem machen kann, oder ist das evtl. ein Bug im Lazarus?

MfG & Thx Bergmann.

Benutzeravatar
theo
Beiträge: 10497
Registriert: Mo 11. Sep 2006, 19:01

Re: Multi-Thread-Anwendung und XInitThreads

Beitrag von theo »

Was machst du in den Threads? Verwendest du Bitmaps oder greifst du sonst auf das X System zu?

Socke
Lazarusforum e. V.
Beiträge: 3158
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Re: Multi-Thread-Anwendung und XInitThreads

Beitrag von Socke »

Bergmann89 hat geschrieben:Die einen sagen ich muss XInitThread aus der xlib aufrufen, doch wenn ich das mach schmieren mir die Ciritical Sections aus der pthread-Unit weg.

An welcher Stelle hattest du denn den Aufruf platziert? Nach meinem Verständnis müsste sie in einem Initialization-Abschnitt einer Unit, die nach cthreads aber vor Interfaces im Programm eingebunden wird, aufgerufen werden -- indirekte Abhängigkeiten wären dabei zu berücksichtigen.
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

mse
Beiträge: 2013
Registriert: Do 16. Okt 2008, 10:22
OS, Lazarus, FPC: Linux,Windows,FreeBSD,(MSEide+MSEgui 4.6,git master FPC 3.0.4,fixes_3_0)
CPU-Target: x86,x64,ARM

Re: Multi-Thread-Anwendung und XInitThreads

Beitrag von mse »

Wenn man xlib aus threads aufrufen will, braucht es einige Vorkehrungen. Nach meiner Erfahrung reicht XInitThreads() nicht immer aus. In MSEgui benutze ich eine zentrale Aufrufstelle, welche durch Mutex geschützt ist und verzichte auf XInitThreads(). Falls du es trotzdem mit XInitThreads() versuchen möchtest, muss es, wie Socke schreibt, vor xopendisplay() (welches vermutlich in "Interfaces" steckt) aufgerufen werden. Hat das widgetset keine entsprechende Einstellung?

mschnell
Beiträge: 3444
Registriert: Mo 11. Sep 2006, 10:24
OS, Lazarus, FPC: svn (Window32, Linux x64, Linux ARM (QNAP) (cross+nativ)
CPU-Target: X32 / X64 / ARMv5
Wohnort: Krefeld

Re: Multi-Thread-Anwendung und XInitThreads

Beitrag von mschnell »

Was macht denn XInitThreads() ?

Ich habe gehört, dass es in Linux - genau wie in Windows - nicht möglich sei, dass eine Anwendung mehrere (X-) GUI-Sessions, jeweils in einem Thread, aufmacht (was ich ziemlich doof finde) und es deshalb nicht schlimm sein, dass die LCL nicht multithreading-fähig ist.

-Michael

Scotty
Beiträge: 768
Registriert: Mo 4. Mai 2009, 13:24
OS, Lazarus, FPC: Arch Linux, Lazarus 1.3 r44426M FPC 2.6.4
CPU-Target: x86_64-linux-qt/gtk2
Kontaktdaten:

Re: Multi-Thread-Anwendung und XInitThreads

Beitrag von Scotty »

Einer meiner Anwender berichtet von dem gleichen Fehler (Bohdi Linux, Enlightment) im Netzwerkthread. Der Client arbeitet einwandfrei und verbindet sich mit einem entfernten Server. Aber wenn der Server lokal gestartet wird, kommt die gleiche Meldung wie bei dir sobald sich der (auch lokale) Client mit diesem Server verbindet (genau bei ServerSocket.CanRead()). Ich konnte den Fehler bei mir auf Arch Linux mit KDE nicht nachvollziehen, und auch in einer VB mit Bohdi lief alles problemlos. Ich rate, dass es an einer Bibliothek/einer bestimmten Kernelversion liegt. Eine Lösung habe ich aber nicht.

Bergmann89
Beiträge: 98
Registriert: Di 15. Nov 2011, 11:36

Re: Multi-Thread-Anwendung und XInitThreads

Beitrag von Bergmann89 »

Hey Leute,

soweit ich weiß nutzte ich nix aus dem X System, zumindest nicht wissentlich. In den Threads lade und speichere ich Texturen. Die 2 Anwendungsfälle bei denen mir der Fehler aufgefallen ist sind folgende:

[Fall 1]
- TJPEGImage erzeugen von HDD laden
- TLatIntfImage erzeugen und aus Bitmap der JPEG laden: intf.LoadFromBitmap(jpeg.BitmapHandle, jpeg.MaskHandle)
- IntfImage nutzen um die ByteDaten der JPEG in ein Format zu konvertieren, das die GrafikKarte lesen kann.

[Fall 2]
- TexturDaten im BMP Format in einen MemoryStream speichern
- normale TBitmap (die im MainThread erstellt wurde, aber zur Zeit von niemandem genutzt wird) aus dem MemoryStream laden

Ich hab auch nochmal ein wenig mit dem XInitThreads rumprobiert. Wenn ich ne extra Unit mach, die das XInitThreads im initialize hat und direct nach cthreads in den usings steht, dann gehts. Das scheint zwar ne Lösung zu sein, aber wirklich zufrieden bin ich damit auch nicht. Das muss doch auch iwie "sauber" gehen.

MfG Bergmann.

Benutzeravatar
theo
Beiträge: 10497
Registriert: Mo 11. Sep 2006, 19:01

Re: Multi-Thread-Anwendung und XInitThreads

Beitrag von theo »

Meines Wissens darfst du keine TBitmap oder TJpegimage benutzen im separaten Thread. Das hängt alles an X, deshalb habe ich nachgefragt.
Benutze die entsprechenden vom GUI losgelösten Varianten aus fpimage, FPReadJPEG etc..

z.B. wie hier: viewtopic.php?p=51688#p51688

Bergmann89
Beiträge: 98
Registriert: Di 15. Nov 2011, 11:36

Re: Multi-Thread-Anwendung und XInitThreads

Beitrag von Bergmann89 »

Hey,

hab mir das grad mal angesehen. TFPCustomImage hat zu wenig Informationen um damit weiter zu arbeiten. Ich brauch ne TLazIntfImage. Da die von TFPCustomImage erbt hab ich einfach die erstellt und geladen, aber die DataDescription wird trotzdem nicht richtig ausgefüllt. Gibts da ne Möglichkeit die TLazIntfImage zu laden?

MfG Bergmann.

Antworten