Я пишу таймер обратного отсчета. Он состоит из одного окна с меткой, в которой отображается время. «Timer ()» (в приведенном ниже коде) создается как поток. Это прекрасно работает в среде Linux, но, насколько мне известно, GTK не поддерживает многопоточность под Windows (поправьте меня, если я ошибаюсь). Можно ли порождать «timer ()» без использования потоков, например, вызвав сигнал при появлении главного окна?
#include <stdio.h>
#include <time.h>
#include <unistd.h>
#include <string.h>
#include <pthread.h>
#include <gtk/gtk.h>
GtkWidget *window;
GtkWidget *label;
pthread_t timer_thread;
void* timer()
{
while(1)
{
// some code here to calculate time
gtk_label_set_markup ((GtkLabel*)label, time_c);
sleep(1);
}
}
static gboolean delete_event( GtkWidget *widget, GdkEvent *event, gpointer data )
{
return FALSE;
}
static void destroy( GtkWidget *widget, gpointer data )
{
gtk_main_quit ();
}
int main(int argc, char **argv)
{
g_thread_init(NULL);
gdk_threads_init();
gdk_threads_enter();
gtk_init (&argc, &argv);
window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
g_signal_connect (window, "delete-event", G_CALLBACK (delete_event), NULL);
g_signal_connect (window, "destroy", G_CALLBACK (destroy), NULL);
label = gtk_label_new("");
gtk_container_add (GTK_CONTAINER (window), label);
gtk_widget_show (label);
gtk_widget_show (window);
pthread_create(&timer_thread, NULL, timer, NULL);
gtk_main ();
gdk_threads_leave();
return 0;
}
Я попытался сделать это, таймер () правильно появился, но главное окно так и не появилось:
static void timer( GtkWidget *widget, gpointer data )
{
while(1)
{
g_print("something"); //for checking
// some code here to calculate time
gtk_label_set_markup ((GtkLabel*)label, time_c);
sleep(1);
}
}
int main(int argc, char **argv)
{
g_signal_connect (window, "show", G_CALLBACK (timer), NULL);
}
Заранее спасибо!