Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C GTK 3 GUI从文本框中的独立线程文本倒计时更新_C_Multithreading_Raspberry Pi_Gtk_Gtk3 - Fatal编程技术网

C GTK 3 GUI从文本框中的独立线程文本倒计时更新

C GTK 3 GUI从文本框中的独立线程文本倒计时更新,c,multithreading,raspberry-pi,gtk,gtk3,C,Multithreading,Raspberry Pi,Gtk,Gtk3,第一篇文章,所以会尽量简短,直到需要添加更多。将一个应用程序从macOS移植到NI LabWindows/CVI,在“C”中,然后移植到GTK3,并尝试从外部线程的概念掌握更新GUI。我已经阅读了gnome文档并在这里和任何地方进行了搜索,但没有找到类似的用法,或者没有从单独的线程中掌握GUI的更新。我对g_idle_add()进行了如下实验 int main(int argc, char* argv[]) { gtk_init(&argc, &argv); // ini

第一篇文章,所以会尽量简短,直到需要添加更多。将一个应用程序从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;
}

这里的问题是,您将在堆栈上分配的字符串作为数据传递给稍后执行的函数(test_name_gui),因此该字符串在test_name_gui执行期间不再存在。调用g_idle_add时应该使用g_strdup(),在test_name_gui结束时使用g_free()。更改
g_idle_add(test_name_gui,string)
g_idle_add(test_name_gui,g_strdup(string))
,然后在test_name_guits结束时添加对
g_free(用户数据)
的调用。我拿出文本视图并使用标签,还有一些代码的其他部分,比如更改按钮文本,没有包装。到目前为止,一切正常。我以前也见过在堆栈上分配解决方案。不再发生车祸。