gpt4 book ai didi

c - GTK+ system(3) 线程调用

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:18:34 26 4
gpt4 key购买 nike

我用 GTK+-2.0 开发了一个简单的应用程序。我的问题是如何在不卡住程序的情况下运行 bash 脚本(例如使用 system(3))?我试图实现一个线程系统,但没有成功。

这是我的代码片段,我尽量简化了。问候

int main(int argc,
char * argv[])
{
GtkWidget *button;


/* init threads */
g_thread_init(NULL);
gdk_threads_init();
gtk_init(&argc,&argv);

window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
...

button = gtk_button_new_with_label("Format");
g_signal_connect(button,"clicked",G_CALLBACK(callback),(gpointer)"button 1");
gtk_table_attach_defaults (GTK_TABLE (table), button, 0, 1, 0, 1);
gtk_widget_show(button);


gdk_threads_enter();
gtk_main();
gdk_threads_leave();

return 0;

}

/* Our callback.
* The data passed to this function is printed to stdout */
static void callback( GtkWidget *widget,
gpointer data )
{
int sTemp=0;
GThread *thread;
GError *error = NULL;
g_print ("Hello again - %s was pressed\n", (char *) data);
sTemp=ChecckIfFileExits("/dev/mmcblk0");
if(sTemp)
{
gtk_label_set_text(GTK_LABEL(label),"Formatting");
thread = g_thread_create( PFormatThrad, (gpointer)widget,
FALSE, &error );
if( ! thread )
{
g_print( "Error: %s\n", error->message );

}

}
else
{
g_print ("SD/MMC not found\n");
}
}


static gpointer
PFormatThrad( gpointer data )
{

sleep( 3 );

gdk_threads_enter();

system("./mkcard.txt /dev/mmcblk0");
gtk_widget_set_sensitive(selectImageButton,TRUE);
gtk_label_set_text(GTK_LABEL(label),"Format tamamlandı\nİmajı Seçin");
gdk_threads_leave();

return( NULL );
}

最佳答案

不要调用 fork()直接。

在 GTK+ 应用程序中,最好使用 glib 的 process spawning API:s .例如 <a href="http://developer.gnome.org/glib/stable/glib-Spawning-Processes.html#g-spawn-async-with-pipes" rel="noreferrer noopener nofollow">g_spawn_async_with_pipes()</a>如果您想读取子进程的输出,该函数非常方便。

关于c - GTK+ system(3) 线程调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12402400/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com