Recent

Author Topic: [SOLVED] Update of TRichMemo from TThread crashes GTK2.  (Read 4916 times)

guest60499

  • Guest
[SOLVED] Update of TRichMemo from TThread crashes GTK2.
« on: February 08, 2017, 05:07:06 pm »
The lines are properly added, per:
Code: Pascal  [Select][+][-]
  1. procedure TTCPClient.Execute;
  2. var
  3.   Line: String;
  4. begin
  5.   try
  6.     Socket.SSL.CertCAFile := FCertFile;
  7.     Socket.Connect(FHost, IntToStr(FPort));
  8.     Socket.SSLDoConnect;
  9.  
  10.     if Socket.LastError <> 0 then
  11.     begin
  12.       if FOnError <> nil then
  13.         FOnError(Self, Socket.LastError, Socket.LastErrorDesc);
  14.       Exit;
  15.     end
  16.     else
  17.     begin
  18.       if FOnConnect <> nil then
  19.         FOnConnect(Self);
  20.       FConnected := True;
  21.     end;
  22.  
  23.     repeat
  24.       while Socket.CanRead(1000) do
  25.       begin
  26.         Line := Socket.RecvString(1);
  27.         if Line = '' then
  28.            continue;
  29.  
  30.         Window.LogClient(Line);
  31.       end;
  32.     until False;
  33.   finally
  34.     if FOnDisconnect <> nil then
  35.       FOnDisconnect(Self);
  36.     Socket.Free;
  37.   end;
  38. end;

Where Window is a TConnectionWindow and LogClient appends to a TRichMemo's Text and sets some styling attributes. After some time the following happens:
Code: [Select]
(relgui:17611): Gtk-CRITICAL **: gtk_text_layout_real_invalidate: assertion 'layout->wrap_loop_count == 0' failed

(relgui:17611): Gtk-CRITICAL **: gtk_text_layout_real_invalidate: assertion 'layout->wrap_loop_count == 0' failed

(relgui:17611): Gtk-CRITICAL **: gtk_text_layout_real_invalidate: assertion 'layout->wrap_loop_count == 0' failed

(relgui:17611): Gtk-CRITICAL **: gtk_text_layout_real_invalidate: assertion 'layout->wrap_loop_count == 0' failed
**
Gdk:ERROR:/home/jmm/scratch/gtk/gtk+2.0-2.24.25/gdk/gdkregion-generic.c:1110:miUnionNonO: assertion failed: (y1 < y2)
Aborted

Is it necessary to use critical sections to access the GUI elements? There should be no contention issues. I am starting to feel I may need to restructure the project completely (e.g. message queues) due to limitations of GTK.

Bart

  • Hero Member
  • *****
  • Posts: 5275
    • Bart en Mariska's Webstek
Re: Update of TRichMemo from TThread crashes GTK2.
« Reply #1 on: February 08, 2017, 05:11:46 pm »
You should not update GUI from mainthread in a separate thread.
Use synchronize method.

Bart

guest60499

  • Guest
Re: Update of TRichMemo from TThread crashes GTK2.
« Reply #2 on: February 08, 2017, 06:15:29 pm »
You should not update GUI from mainthread in a separate thread.
Use synchronize method.

Bart

Yep, Synchronize updates the UI properly. It's maddening that it works some of the time. Luckily Synchronize lets me keep certain data within the TThread descendant, because otherwise it devolves into a mess of message passing.

 

TinyPortal © 2005-2018