|
View:
New views
5 Messages
—
Rating Filter:
Alert me
|
|
|
Problem using g_io_add_watchHello,
I'm having trouble using GIOChannel g_io_add_watch function. * A sub-library I use opens and writes to a file like this: FILE * f = fopen("./LogFile", "w+"); ... fprintf(f, "LogMessage\n"); * In my library, I get a GIOChannel on this file and try to add a watch on it like this: GIOChannel * io = g_io_channel_win32_new_fd(fileno(f)); ... g_io_add_watch(io, G_IO_IN, io_func, data); Problem: When I call g_io_add_watch my application is crashing with no explanation. Goal: I'd like to update a GtkTextBuffer with a GIOFunc ("io_func"). (If I do not call this function, GIOChannel works fine) Configuration: - OS: Windows Vista (please do not whip me or tell me to go under linux). - IDE: Eclipse - Compiler: mingw32-gcc - Make: mingw32-make PS: I had a problem with GIOChannel before because I was using Cygwin gcc to compile (linking with kernel32 and user32) and I read somewhere that I should use MinGW gcc (linking with wsock32) instead, is it wright ? And sorry for my english, I am French. Thanks in advance. _______________________________________________ gtk-app-devel-list mailing list gtk-app-devel-list@... http://mail.gnome.org/mailman/listinfo/gtk-app-devel-list |
|
|
Re: Problem using g_io_add_watch> Problem: When I call g_io_add_watch my application is crashing with no explanation.
Can you provide a *minimal* but *complete* sample program (just one source file) that crashes in the same way? > PS: I had a problem with GIOChannel before because I was using Cygwin gcc to > compile (linking with kernel32 and user32) and I read somewhere that I > should use MinGW gcc If you use the Windows GLib packages from ftp.gnome.org, then yes, they are not for use by Cygwin programs, so you should use mingw to compile code that uses them. > (linking with wsock32) instead, is it right ? wsock32 in particular has little to do with it. Cygwin is just a completely different operating system (even if it happens to run on top of Windows), so you should not use non-Cygwin libraries in Cygwin programs. (Unless in very special cases when you know exactly what you are doing. GLib is not such a case.) --tml _______________________________________________ gtk-app-devel-list mailing list gtk-app-devel-list@... http://mail.gnome.org/mailman/listinfo/gtk-app-devel-list |
|
|
Re: Problem using g_io_add_watchHello,
Problem: When I call g_io_add_watch my application is crashing with no explanation. Here is the shorter file I could write to expose my probem using g_io_add_watch : ========================================================== #include <stdio.h> #include <gtk/gtk.h> static FILE * MyLogFile = NULL; void write_in_file(GtkButton * b, gpointer user_data) { static int i = 0; fprintf(MyLogFile, "Something written %d\n", i); i++; } gboolean on_buffer_in (GIOChannel *source, GIOCondition condition, gpointer data) { gchar ** str_return = NULL; gsize * length = NULL; GtkTextIter end; GError * error = NULL; GtkTextBuffer * buffer = (GtkTextBuffer *)data; g_io_channel_read_to_end(source, str_return, length, &error); gtk_text_buffer_get_end_iter (buffer, &end); gtk_text_buffer_insert(buffer, &end, *str_return, *length); return FALSE; } void my_exit() { fclose(MyLogFile); gtk_exit(0); } GtkWidget * create_window(void) { GtkWidget *window; GtkWidget *vbox_win; GtkWidget *button; GtkWidget *log_view; GtkTextBuffer *log_buffer; GIOChannel * log_channel; window = gtk_window_new (GTK_WINDOW_TOPLEVEL); gtk_window_set_title (GTK_WINDOW (window), "TestGIO"); vbox_win = gtk_vbox_new (FALSE, 5); gtk_widget_show (vbox_win); gtk_container_add (GTK_CONTAINER (window), vbox_win); log_buffer = gtk_text_buffer_new(NULL); log_view = gtk_text_view_new_with_buffer(log_buffer); gtk_widget_show(log_view); gtk_text_view_set_editable(GTK_TEXT_VIEW(log_view), FALSE); gtk_box_pack_start (GTK_BOX (vbox_win), log_view, TRUE, TRUE, 0); #ifdef MSDOS log_channel = g_io_channel_win32_new_fd(fileno(MyLogFile)); g_debug("Windows Log file %d %p", fileno(MyLogFile), log_channel); #else log_channel = g_io_channel_unix_new (fileno(MyLogFile)); g_debug("Unix Log file %d %p", fileno(MyLogFile), log_channel); #endif // The line that crashes : g_io_add_watch(log_channel, G_IO_IN, on_buffer_in, (gpointer) log_buffer); button = gtk_button_new_with_label("Write something"); gtk_widget_show(button); gtk_box_pack_start (GTK_BOX (vbox_win), button, FALSE, FALSE, 0); g_signal_connect(G_OBJECT(button), "clicked", G_CALLBACK (write_in_file), NULL); return window; } int main (int argc, char *argv[]) { GtkWidget *window; gtk_set_locale (); gtk_init (&argc, &argv); MyLogFile = fopen("./MyLogFile.txt", "w+"); g_debug("Log file number : %d", fileno(MyLogFile)); window = create_window (); g_signal_connect(G_OBJECT(window), "destroy", G_CALLBACK (my_exit), NULL); gtk_widget_show (window); gtk_main (); return 0; } ======================================================== 2008/6/19 Tor Lillqvist <tml@...>: > > Problem: When I call g_io_add_watch my application is crashing with no > explanation. > > Can you provide a *minimal* but *complete* sample program (just one > source file) that crashes in the same way? > > > PS: I had a problem with GIOChannel before because I was using Cygwin gcc > to > > compile (linking with kernel32 and user32) and I read somewhere that I > > should use MinGW gcc > > If you use the Windows GLib packages from ftp.gnome.org, then yes, > they are not for use by Cygwin programs, so you should use mingw to > compile code that uses them. > > > (linking with wsock32) instead, is it right ? > > wsock32 in particular has little to do with it. Cygwin is just a > completely different operating system (even if it happens to run on > top of Windows), so you should not use non-Cygwin libraries in Cygwin > programs. (Unless in very special cases when you know exactly what you > are doing. GLib is not such a case.) > > --tml > gtk-app-devel-list mailing list gtk-app-devel-list@... http://mail.gnome.org/mailman/listinfo/gtk-app-devel-list |
|
|
Re: Problem using g_io_add_watchOups,
I realised that my IO callback function was not well written, so I wrote a new one. PROBLEM : Now the problem is that this IO callback is called continuously in main loop even if nothing is written in the watched file. I noticed that if I return FALSE, the callback is called once but is no longer called on a write on the watched file. Should I do some SEEK operation on the file or on the GIOChannel ? Thanks Here is the new callback : ====================================================== gboolean io_callback_end(GIOChannel *source, GIOCondition condition, gpointer data) { gchar * str_return; gsize length; GtkTextIter end; GError * error = NULL; GtkTextBuffer * buffer = (GtkTextBuffer *)data; if(condition == G_IO_IN) { GIOStatus status = g_io_channel_read_to_end(source, &str_return, &length, &error); gtk_text_buffer_get_end_iter (buffer, &end); gtk_text_buffer_insert(buffer, &end, str_return, length); switch(status) { case G_IO_STATUS_ERROR: g_debug("G_IO_STATUS_ERROR : on_buffer_in"); break; case G_IO_STATUS_NORMAL: g_debug("G_IO_STATUS_NORMAL : on_buffer_in %s", str_return); break; default: g_debug("Should not be here : on_buffer_in"); } g_free(str_return); } return TRUE; } ====================================================== 2008/6/25 sinsedrix <sinsedrix@...>: > Hello, > > Problem: When I call g_io_add_watch my application is crashing with no > explanation. > > Here is the shorter file I could write to expose my probem using > g_io_add_watch : > > ========================================================== > #include <stdio.h> > > #include <gtk/gtk.h> > > static FILE * MyLogFile = NULL; > > void write_in_file(GtkButton * b, gpointer user_data) { > static int i = 0; > fprintf(MyLogFile, "Something written %d\n", i); > i++; > } > > gboolean on_buffer_in (GIOChannel > *source, > GIOCondition > condition, > gpointer data) { > gchar ** str_return = NULL; > gsize * length = NULL; > GtkTextIter end; > GError * error = NULL; > GtkTextBuffer * buffer = (GtkTextBuffer *)data; > > g_io_channel_read_to_end(source, str_return, length, &error); > gtk_text_buffer_get_end_iter (buffer, &end); > gtk_text_buffer_insert(buffer, &end, *str_return, *length); > > return FALSE; > } > > void my_exit() { > fclose(MyLogFile); > gtk_exit(0); > } > > GtkWidget * create_window(void) { > GtkWidget *window; > GtkWidget *vbox_win; > GtkWidget *button; > > GtkWidget *log_view; > GtkTextBuffer *log_buffer; > GIOChannel * log_channel; > > window = gtk_window_new (GTK_WINDOW_TOPLEVEL); > gtk_window_set_title (GTK_WINDOW (window), "TestGIO"); > > vbox_win = gtk_vbox_new (FALSE, 5); > gtk_widget_show (vbox_win); > gtk_container_add (GTK_CONTAINER (window), vbox_win); > > log_buffer = gtk_text_buffer_new(NULL); > log_view = gtk_text_view_new_with_buffer(log_buffer); > gtk_widget_show(log_view); > gtk_text_view_set_editable(GTK_TEXT_VIEW(log_view), FALSE); > gtk_box_pack_start (GTK_BOX (vbox_win), log_view, TRUE, TRUE, 0); > > #ifdef MSDOS > log_channel = g_io_channel_win32_new_fd(fileno(MyLogFile)); > g_debug("Windows Log file %d %p", fileno(MyLogFile), log_channel); > #else > log_channel = g_io_channel_unix_new (fileno(MyLogFile)); > g_debug("Unix Log file %d %p", fileno(MyLogFile), log_channel); > #endif > > // The line that crashes : > g_io_add_watch(log_channel, G_IO_IN, on_buffer_in, (gpointer) > log_buffer); > > button = gtk_button_new_with_label("Write something"); > gtk_widget_show(button); > gtk_box_pack_start (GTK_BOX (vbox_win), button, FALSE, FALSE, 0); > > g_signal_connect(G_OBJECT(button), "clicked", G_CALLBACK > (write_in_file), NULL); > > return window; > } > > int > main (int argc, char *argv[]) > { > GtkWidget *window; > > gtk_set_locale (); > gtk_init (&argc, &argv); > > MyLogFile = fopen("./MyLogFile.txt", "w+"); > g_debug("Log file number : %d", fileno(MyLogFile)); > > window = create_window (); > g_signal_connect(G_OBJECT(window), "destroy", G_CALLBACK (my_exit), > NULL); > gtk_widget_show (window); > > gtk_main (); > return 0; > } > ======================================================== > > 2008/6/19 Tor Lillqvist <tml@...>: > > > Problem: When I call g_io_add_watch my application is crashing with no >> explanation. >> >> Can you provide a *minimal* but *complete* sample program (just one >> source file) that crashes in the same way? >> >> > PS: I had a problem with GIOChannel before because I was using Cygwin >> gcc to >> > compile (linking with kernel32 and user32) and I read somewhere that I >> > should use MinGW gcc >> >> If you use the Windows GLib packages from ftp.gnome.org, then yes, >> they are not for use by Cygwin programs, so you should use mingw to >> compile code that uses them. >> >> > (linking with wsock32) instead, is it right ? >> >> wsock32 in particular has little to do with it. Cygwin is just a >> completely different operating system (even if it happens to run on >> top of Windows), so you should not use non-Cygwin libraries in Cygwin >> programs. (Unless in very special cases when you know exactly what you >> are doing. GLib is not such a case.) >> >> --tml >> > > gtk-app-devel-list mailing list gtk-app-devel-list@... http://mail.gnome.org/mailman/listinfo/gtk-app-devel-list |
|
|
Re: Problem using g_io_add_watchHi,
I can see something wrong in your code: you do not have to check the GIOCondition using the "==" operator, just because its content is a XORed sequence of integers. If you do something like this: if ( ( condition & G_IO_IN ) != 0 ), everything will gonna be alright. The condition variable is a kind of "bit field", and G_IO_IN may be one of the checked bits, among many others (G_IO_OUT, G_IO_PRI, G_IO_ERR). Yet, I suggest you to do the following: add the G_IO_HUP to the command g_io_add_watch, and return the function if this buffer condition had been received. For example: g_io_add_watch(log_channel, G_IO_IN | G_IO_HUP, on_buffer_in, (gpointer)log_buffer); And inside the iochannel callback, check for the G_IO_HUP and return if this condition is checked... []'s Rosfran Borges On Wed, Jun 25, 2008 at 2:45 PM, sinsedrix <sinsedrix@...> wrote: > Oups, > > I realised that my IO callback function was not well written, so I wrote a > new one. > > PROBLEM : Now the problem is that this IO callback is called continuously > in > main loop even if nothing > is written in the watched file. > > I noticed that if I return FALSE, the callback is called once but is no > longer called on a > write on the watched file. > > Should I do some SEEK operation on the file or on the GIOChannel ? > > Thanks > > Here is the new callback : > > ====================================================== > gboolean > io_callback_end(GIOChannel *source, GIOCondition condition, gpointer data) > { > gchar * str_return; > gsize length; > GtkTextIter end; > GError * error = NULL; > GtkTextBuffer * buffer = (GtkTextBuffer *)data; > > if(condition == G_IO_IN) { > GIOStatus status = g_io_channel_read_to_end(source, &str_return, > &length, &error); > gtk_text_buffer_get_end_iter (buffer, &end); > gtk_text_buffer_insert(buffer, &end, str_return, length); > > switch(status) { > case G_IO_STATUS_ERROR: > g_debug("G_IO_STATUS_ERROR : on_buffer_in"); > break; > case G_IO_STATUS_NORMAL: > g_debug("G_IO_STATUS_NORMAL : on_buffer_in %s", str_return); > break; > default: > g_debug("Should not be here : on_buffer_in"); > } > > g_free(str_return); > } > return TRUE; > } > ====================================================== > > > 2008/6/25 sinsedrix <sinsedrix@...>: > > > Hello, > > > > Problem: When I call g_io_add_watch my application is crashing with no > > explanation. > > > > Here is the shorter file I could write to expose my probem using > > g_io_add_watch : > > > > ========================================================== > > #include <stdio.h> > > > > #include <gtk/gtk.h> > > > > static FILE * MyLogFile = NULL; > > > > void write_in_file(GtkButton * b, gpointer user_data) { > > static int i = 0; > > fprintf(MyLogFile, "Something written %d\n", i); > > i++; > > } > > > > gboolean on_buffer_in (GIOChannel > > *source, > > GIOCondition > > condition, > > gpointer data) { > > gchar ** str_return = NULL; > > gsize * length = NULL; > > GtkTextIter end; > > GError * error = NULL; > > GtkTextBuffer * buffer = (GtkTextBuffer *)data; > > > > g_io_channel_read_to_end(source, str_return, length, &error); > > gtk_text_buffer_get_end_iter (buffer, &end); > > gtk_text_buffer_insert(buffer, &end, *str_return, *length); > > > > return FALSE; > > } > > > > void my_exit() { > > fclose(MyLogFile); > > gtk_exit(0); > > } > > > > GtkWidget * create_window(void) { > > GtkWidget *window; > > GtkWidget *vbox_win; > > GtkWidget *button; > > > > GtkWidget *log_view; > > GtkTextBuffer *log_buffer; > > GIOChannel * log_channel; > > > > window = gtk_window_new (GTK_WINDOW_TOPLEVEL); > > gtk_window_set_title (GTK_WINDOW (window), "TestGIO"); > > > > vbox_win = gtk_vbox_new (FALSE, 5); > > gtk_widget_show (vbox_win); > > gtk_container_add (GTK_CONTAINER (window), vbox_win); > > > > log_buffer = gtk_text_buffer_new(NULL); > > log_view = gtk_text_view_new_with_buffer(log_buffer); > > gtk_widget_show(log_view); > > gtk_text_view_set_editable(GTK_TEXT_VIEW(log_view), FALSE); > > gtk_box_pack_start (GTK_BOX (vbox_win), log_view, TRUE, TRUE, 0); > > > > #ifdef MSDOS > > log_channel = g_io_channel_win32_new_fd(fileno(MyLogFile)); > > g_debug("Windows Log file %d %p", fileno(MyLogFile), log_channel); > > #else > > log_channel = g_io_channel_unix_new (fileno(MyLogFile)); > > g_debug("Unix Log file %d %p", fileno(MyLogFile), log_channel); > > #endif > > > > // The line that crashes : > > g_io_add_watch(log_channel, G_IO_IN, on_buffer_in, (gpointer) > > log_buffer); > > > > button = gtk_button_new_with_label("Write something"); > > gtk_widget_show(button); > > gtk_box_pack_start (GTK_BOX (vbox_win), button, FALSE, FALSE, 0); > > > > g_signal_connect(G_OBJECT(button), "clicked", G_CALLBACK > > (write_in_file), NULL); > > > > return window; > > } > > > > int > > main (int argc, char *argv[]) > > { > > GtkWidget *window; > > > > gtk_set_locale (); > > gtk_init (&argc, &argv); > > > > MyLogFile = fopen("./MyLogFile.txt", "w+"); > > g_debug("Log file number : %d", fileno(MyLogFile)); > > > > window = create_window (); > > g_signal_connect(G_OBJECT(window), "destroy", G_CALLBACK (my_exit), > > NULL); > > gtk_widget_show (window); > > > > gtk_main (); > > return 0; > > } > > ======================================================== > > > > 2008/6/19 Tor Lillqvist <tml@...>: > > > > > Problem: When I call g_io_add_watch my application is crashing with no > >> explanation. > >> > >> Can you provide a *minimal* but *complete* sample program (just one > >> source file) that crashes in the same way? > >> > >> > PS: I had a problem with GIOChannel before because I was using Cygwin > >> gcc to > >> > compile (linking with kernel32 and user32) and I read somewhere that I > >> > should use MinGW gcc > >> > >> If you use the Windows GLib packages from ftp.gnome.org, then yes, > >> they are not for use by Cygwin programs, so you should use mingw to > >> compile code that uses them. > >> > >> > (linking with wsock32) instead, is it right ? > >> > >> wsock32 in particular has little to do with it. Cygwin is just a > >> completely different operating system (even if it happens to run on > >> top of Windows), so you should not use non-Cygwin libraries in Cygwin > >> programs. (Unless in very special cases when you know exactly what you > >> are doing. GLib is not such a case.) > >> > >> --tml > >> > > > > > _______________________________________________ > gtk-app-devel-list mailing list > gtk-app-devel-list@... > http://mail.gnome.org/mailman/listinfo/gtk-app-devel-list > gtk-app-devel-list mailing list gtk-app-devel-list@... http://mail.gnome.org/mailman/listinfo/gtk-app-devel-list |
| Free Forum Powered by Nabble | Forum Help |