首页 > 解决方案 > GTK 3 GUI 从文本框中的单独线程文本倒计时更新

问题描述

第一篇文章,所以会尽量简短,直到需要添加更多。将应用程序从 macOS 移植到 NI LabWindows/CVI,在“C”中,然后移植到 GTK3,并尝试从外部线程概念掌握更新的 GUI。我已经阅读了 gnome 文档并在这里和任何地方进行了搜索,但没有找到类似的用法,或者没有从单独的线程中掌握更新 GUI。我已经对 g_idle_add() 进行了如下试验。

int main(int argc, char* argv[])
{
    gtk_init(&argc, &argv); // init Gtk
    gtk_start_button = GTK_WIDGET(gtk_builder_get_object(builder,"start_button"));
    gtk_main();

    return EXIT_SUCCESS;
}

void start_button_clicked_cb(GtkWidget *widget, gpointer data)
{
    printf("\nStart Button Pressed\n");

    run_tests();
}

void run_tests( void )
{
    GThread *start_testing_thread;
    start_testing_thread = g_thread_new("", &start_testing, NULL);
}

void *start_testing (void *data)
{
    pause(5);
}

void pause( double pause_time)
{
    char    string[33];

    while( (double)pause_time > (double)0 )
    {
        sprintf( string, "Pausing %02.1f", pause_time );
        printf(string);


        //test_name( string );
        g_idle_add(test_name_gui, string);

        g_usleep(100000);   // uSecs for 100 mSecs

        pause_time -= 0.1;
    }
}

void test_name_gui(gpointer user_data)
{
    GtkTextBuffer*      buffer = gtk_text_buffer_new(NULL);
    char                temp[99];
    int error = -1;

    buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW (gtktextview_test_name));

    sprintf(temp,"\n%s gui\n",(char*)user_data);
    printf(temp);

    if(!g_utf8_validate(user_data,-1,NULL))
    {
        error = 3;
    }

    gtk_text_buffer_set_text (buffer, (char*)user_data, -1);

    printf("\nTest Name gui\n");

    g_object_unref(buffer);

    return G_SOURCE_REMOVE;
}

标签: cmultithreadingraspberry-pigtkgtk3

解决方案


推荐阅读