Without seeing the code it is a bit hard to tell exactly what is going on, and I am sure that it is a bit too big to post here.
Going by your description it sounds like you are forking many processes each using its own GTK main loop.
There could be several problems here first one is related to this I found by doing a search http://developer.gnome.org/gtk-faq/stable/x505.html
. So if you use fork() and then use exit() you have effectively closed the socket to the X11 server.
Another problem could be that you have a X11 socket connection created in the parent via GTK and then trying to reuse it in the child processes with the data entering the socket in a bad order.
I would consider rewriting the code so as to not use fork(). Going by your description of what you want done I do not think that you need to use fork(), you also do not need to use threads. But if you do need to use threads you just need one thread to deal with the graphical user interface (GTK/GDK/Cairo etc) and one thread to read in the data and place it in a buffer to be processed by the GUI thread.