I developed a simple application with GTK+-2.0. My question is how can run a bash script (for example with system(3)) without freezing program? I tried to implement a thread system but it did not worked.
Here is my code snippet, I tried to simplify as good as I can. Regards
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 );
}
Don't call fork()
directly.
It's better, in a GTK+ application, to use glib's process spawning API:s . For instance the g_spawn_async_with_pipes()
function is very handy if you want to read the child process' output.
Try forking your process and start the bash script in the forked process.
#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;
}
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.