[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]

Re: Problem using g_io_add_watch



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 iki fi>:

> > 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
>


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]