繁体   English   中英

带线程的GTK + system(3)调用

GTK+ system(3) call with thread

提示:本站收集StackOverFlow近2千万问答,支持中英文搜索,鼠标放在语句上弹窗显示对应的参考中文或英文, 本站还提供   中文繁体   英文版本   中英对照 版本,有任何建议请联系yoyou2525@163.com。

我使用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 );
}    
2 个回复

不要直接调用fork()

在GTK +应用程序中,最好使用glib的进程生成API:s 例如,如果要读取子进程的输出,则g_spawn_async_with_pipes()函数非常方便。

尝试分叉您的进程,并在分叉的进程中启动bash脚本。

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>

int main ()
{
   int pid;

   pid = fork();

   if (pid == 0) {
      // Call bash script
   } else if (pid > 0) {
     // Your parent process
   }
   return 0;
}
1 GTK+ 3 线程安全吗?

我有一个具有多个线程的应用程序。 一些线程使用建立在 pthread API 之上的库。 阅读文档似乎有一次你不得不调用gdk_threads_enter和gdk_threads_leave 。 但是查看文档,所有内容似乎都已被弃用。 现在他们说你需要从主线程做所有事情。 但是在main_thr ...

2 GTK +线程安全

我试图使用线程来管理GTK +中的几件事,但是,一旦我尝试在新线程中使用任何GUI函数,它就会锁定GUI,这很有意义,因为GTK +并不是线程安全的。 有没有办法解决? 这是我的代码: ...

3 在GTK + 2上应用系统规模

我试图在高DPI监视器上运行GTK + 2应用程序,这会导致一些布局问题,因为传递给gtk_widget_set_size_request()的值以像素为单位。 我可以解决通过读取这些问题Xft.dpi Xresource和所有的像素值I传送给乘法gtk_widget_set_size_r ...

2018-03-07 15:14:58 0 204   gtk/ gtk2
4 GTK+ 接口应该在单独的线程中运行吗?

我正在 GTK+(更具体地说是C++和gtkmm )中迈出我的第一步,我对如何最好地构建我的程序有一个相当概念性的怀疑。 现在我只希望我的 GUI 通过打印几个值来显示我的 C++ 程序中发生的事情,并且由于我的主线程在 GUI 窗口运行时停止,我遇到了将处理/计算操作和单独线程中的图形界面。 这是 ...

5 同步调度到 GTK+ 的主线程

我正在将我现有的一些软件从 macOS 和 Windows 移植到 Linux。 该软件的基础是一个运行在 GUI 后面的多线程服务器,用于显示统计信息、针对特定事件生成新窗口等。 在 macOS 上,我们有DispatchQueue.main.sync 。 在 Windows / C# / WP ...

6 OpenGL是否依赖于诸如GTK +之类的窗口系统?

我最近决定开始学习OpenGL,但我有几个问题。 主要是,我想知道OpenGL是否依赖于窗口系统(例如GTK +)以及对窗口系统API的扩展,从而可以创建OpenGL区域。 我还在OpenGL Wiki上看到了类似Xlib的内容,这似乎是到X窗口系统的更直接的连接。 Xlib只是一个更基本 ...

7 每x秒调用GTK +函数

所以我正在为现有的c应用程序编写一个gui。 gui只是一个简单的界面,它只显示并且不会真正将任何信息反馈到应用程序中。 但是如果有一些新信息,我需要检查一个链表。 现在我不想使用另一个线程手动运行该功能来执行此操作。 有没有办法'破解'定时函数或回调到GTK主循环? 这样 ...

8 调用GTK + gui中的外部函数

我有一个main.c,它与一些头文件和其他c文件链接。完成该程序后,它是一个基于终端的程序,该程序可通过switch使用用户输入。当我输入“ o”时,它将与硬件板关联,然后打开并显示“ c”关闭。 我得到了一个用c编写的带有打开的cloase和退出按钮的示例GTK + gui代码。 ...

9 如何从Cython呼叫Gtk + 3

在相当不错的Debian / Ubuntu发行版上,使用Python 2(或3); 通过sudo python -m pip install cython ( sudo python -m pip install cython ) 如何调用gtk3 C API? 我需要任何gtk ...

10 GTK +应用程序:接收来自辅助线程的输入

我有一个带有GtkTextBuffer的GTK +应用程序。 它使用几个工作线程来执行一些冗长的操作。 这些线程可以以文本格式报告其进度。 我想显示有关工作线程如何执行的详细信息。 您能告诉我如何从工作线程中接收输入吗? 我以为我可以从工作线程中发出“插入文本”信号,但是在谷歌搜索 ...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2021 STACKOOM.COM