创建三个并发进程linux,linux下分窗口同时显示三个并发进程的小程序

#include/*该数据结构保持对进度条信息的跟踪。信息包括:进度条构件,对话框构件,指示对话框

*是否能关闭的标志,以及最新已知的在进度条构件上显示百分比。

*/

typedef struct{

GtkWidget *progressbar;

GtkWidget *window;

int bProgressUp;

int nLastPct;

}typProgressData;

typProgressData *pdata;

/*函数CanCloseWindow阻止用户关闭窗口,一直到操作完成为止。当用户试图关闭对话窗口

*时,“destroy(删除事件)”信号调用这一函数。返回值表示是否可以关闭窗口。

*/

gint CanWindowClose(GtkWidget *widget)

{

/*---TRUE=>cannot close---*/

/*---FALSE=>can close---*/

return(pdata->bProgressUp);

}

//在对话框内建立进度条

void StartProgress()

{

//GtkWidget 是构件的存储类型

GtkWidget *label;

GtkWidget *table;

GtkWidget *window;

GtkAdjustment *adj;

//为传递到回调函数中的数据分配内存

pdata=g_malloc(sizeof(typProgressData));

//对已知的在进度条构件上显示的百分比赋初值

pdata->nLastPct=-1;

//为指示对话框是否能关闭的标志赋初值

pdata->bProgressUp=TRUE;

//Create the top-level window

window=gtk_window_new(GTK_WINDOW_TOPLEVEL);

pdata->window=window;

/*当视窗收到"destroy"信号时,会呼叫到CanWindowClose函数送到该函数的资料将会是

*pdata,将根据其值决定是否关闭窗口

*/

gtk_signal_connect(GTK_OBJECT(window),"destroy",

GTK_SIGNAL_FUNC(CanWindowClose),pdata);

//设定视窗的边框的宽度

gtk_container_border_width(GTK_CONTAINER(window),10);

//创建一个包含3*2个格子的表格

table=gtk_table_new(3,2,TRUE);

//用gtk_container_add函数将表格放置到窗口中

gtk_container_add(GTK_CONTAINER(window),table);

//创建一个标签"loading..."

label=gtk_label_new("loading...");

/*---将构件标签加到表中---*/

/*函数gtk_table_attach_defaults(table,widget,left_attach,right_attach,

* top_attach,botton_attach);

*标签在表的左上角,占2平方(0,2,0,1)

*/

gtk_table_attach_defaults(GTK_TABLE(table),label,0,2,0,1);

gtk_widget_show(label);

/*---将进度条加到表中---*/

/*函数:GtkObject *gtk_adjustment_new(gdouble value,

gdouble lower,

gdouble upper,

gdouble step_increment,

gdouble page_increment,

gdouble page_size);

*创建调整对象。

*value---微调按钮构件的初始值;lower---构件允许的最小值;

*upper---构件允许的最大值;page_size:没有用到;

*step_increment---鼠标左键按下时构件一次增加/减小的值;

*page_increment---鼠标右键按下时构件一次增加/减小的值;

*/

adj=(GtkAdjustment *)gtk_adjustment_new(0,0,400,0,0,0);

//调用gtk_progress_bar_new_with_adjustment函数建立进度条构件。

pdata->progressbar=gtk_progress_bar_new_with_adjustment(adj);

//进度条构件在表的左下角,占2平方(0,2,1,2)

gtk_table_attach_defaults(GTK_TABLE(table),

pdata->progressbar,0,2,1,2);

gtk_widget_show(pdata->progressbar);

//Show everything

gtk_widget_show(table);

gtk_widget_show(window);

}

/*函数UpdateProgress用耗费时间的操作的当前状态更改进度条,来反映当前状态下读入文

*件的百分比。它取两个值--当前状态值和最终状态值。当当前状态值和最终状态值相等时,

*完成全部操作。状态值是文件的容量,而当前状态值则是读入文件的位置。

*pos---文件已被读入的长度.

*len---文件的长度.

*(pos/len)=读入文件的百分比.

*/

void UpdateProgress(long pos,long len)

{

gfloat pvalue;

int pct;

//Prevent divide by zero errors

if(len>0){

//计算当前状态下读入文件的百分比

pvalue=(gfloat)pos/(gfloat)len;

pct=pvalue*100;

/*当最新已知的进度条构件上应该显示的百分比与进度条上显示的百分比不相符,调用

*gtk_progress_set_percent函数更改进度条构件的显示,并传递新的完成值作为参数。

*其中0表示完全没有完成,1表示全部完成。

*/

if(pdata->nLastPct!=pct){

gtk_progress_set_percentage(GTK_PROGRESS(pdata->progressbar),

pvalue);

/*---更新进度条---*/

while(gtk_events_pending()){

gtk_main_iteration();

}//执行所有等候判断的事件及高优先权的idle函数.然後立即返回

pdata->nLastPct=pct;

}

}

}

//函数EndProgress关闭带有进度条的对话框。在操作完成后调用这一函数关闭对话框

void EndProgress()

{

//允许带进度条的对话框被关闭

pdata->bProgressUp=FALSE;

/*呼叫gtk_widget_destroy()函数, 传入进度条构件做为参数, 并将该构件销毁.这会导

*致该进度条构件送出"destroy"信号, 收到该信号后,会呼叫我们的destroy() callback

* 函数,而我们的destroy()会令程式离开GTK。

*/

gtk_widget_destroy(pdata->window);

//释放被占用的空间

g_free(pdata);

pdata=NULL;

}

int ptimer;

int nValue;

gint UpdateProgressTimer(gpointer data)

{

/*---Increment value---*/

nValue+=2;

//调用函数UpdateProgress来更新进度条

UpdateProgress(nValue,100);

/*当进度条走完,调用函数EndProgress()关闭带有进度条的对话框。使用函数

* gtk_timeout_remove来结束对函数gtk_time_add的调用。函数gtk_timeout_remove使*用的参数是gtk_time_add函数的返回值。

*/

if(nValue==100){

EndProgress();

gtk_timeout_remove(ptimer);

gtk_main_quit();

}

}

/*当按键"Progress Bar"收到"clicked"信号时,它会呼叫函数ButtonClicked()来创建进度

*条。

*/

gint ButtonClicked(GtkWidget *widget,gpointer data)

{

//对nValue进行初始化并在对话框内建立进度条

nValue=0;

StartProgress();

/*使用gtk_timeout_add函数建立定时器。这一函数取时间,函数和data作为参数。

*该函数调用每隔100ms调用UpdateProgressTimer函数一次,并用data作为它的参数。

*返回值是定时器的ID,在结束定时器时要用到它

*/

ptimer=gtk_timeout_add(100,UpdateProgressTimer,data);

}

//关掉对话框

gint CloseAppWindow()

{

gtk_main_quit();

return(FALSE);

}

int bar(int argc,char *argv[])

{

//GtkWidget用以储存视窗物件形态

GtkWidget *window;

GtkWidget *button;

/*呼叫函数gtk_init(gint *argc, gchar ***argv)将会启动GTK. 该函数设定了一些内定

*的值, 并且後续交给gdk_init(gint *argc, gchar ***argv) 继续处理. 该函数启动了

*了一些函数库以供使用, 设定了内定的信号处理, 检查传给您的程式的命令列参数.

*/

gtk_init(&argc,&argv);

/*---产生新视窗---*/

/*GTK_WINDOW_TOPLEVEL参数指定了我们承习视窗管理程式的外观。即便我们产生一个0*0

*大小的视窗,没有子视窗的视窗内定被设为200*200,如此我们依然可以处理它。

*/

window=gtk_window_new(GTK_WINDOW_TOPLEVEL);

//调用get_window_set_title函数设置标题"Progress Bar"

gtk_window_set_title(GTK_WINDOW(window),"Progress Bar");

/*当视窗收到"destroy"信号时(可由该软体或视窗管理程式所送出) 会被呼叫到的

*CloseAppWindow函数所一如以下所定义的一般. 送到该函数的资料将会是NULL,并且在

*该函数中被忽略

*/

gtk_signal_connect(GTK_OBJECT(window),"destroy",

GTK_SIGNAL_FUNC(CloseAppWindow),NULL);

//产生一个新的按钮并带有"Progress Bar"的字在上面

button=gtk_button_new_with_label("Progress Bar");

//显示最新产生的视窗物件

gtk_widget_show(button);

/*当该按键收到"clicked"信号, 它会呼叫ButtonClicked()这个函数.并且以NULL做为其

*参数. ButtonClicked()函数在以上已定义*过.

*/

gtk_signal_connect(GTK_OBJECT(button),"clicked",

GTK_SIGNAL_FUNC(ButtonClicked),NULL);

//这个动作会把这个按钮结合到该视窗(a gtk container)

gtk_container_add(GTK_CONTAINER(window),button);

//gtk_widget_show()函数,让GTK知道,已经处理完设定其属性的工作,并可以显示它。

//显示该视窗

gtk_widget_show(window);

/*所有GTK程式都一定要有gtk_main(). 所有控制结束於此并等待事件的发生(像按下一键

*或鼠标的移动).

*/

gtk_main();

exit(0);

}

int main(int argc,char *argv[])

{

pid_t pid; //可以用int代替pid_t

fflush(stdout); //清除缓冲区

pid=fork(); //创建孩子进程1,first child prcess

if(pid==0) //pid为0,该进程为子进程

{

pid=fork();

if(pid>0) //pid>0为second child procss的父进程first child process

{

sleep(1);

printf("The second process creat now\n");

bar(argc,argv); //调用函数bat(argc,argv),创建进度条

printf("The second process exit now\n");

exit(0);

}

sleep(2); //睡眠1秒

printf("The third process creat now\n");

bar(argc,argv);

printf("The third process exit now\n"); //second child process退出

}

//为father process

else if(pid>0) {

printf("The first process creat now\n");

bar(argc,argv);

printf("The first process exit now\n");

}

else //返回pid为-1,创建失败

{

printf("fork fail\n");

exit(-1);

}

exit(0);

}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值