- 论坛徽章:
- 0
|
大家帮我看看哪里错了,,谢谢大家啦!!
以下是程序代码:
-----------------------------------------------------------------------------
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <stdlib.h>
#include<gtk/gtk.h>
/*该数据结构保持对进度条信息的跟踪。信息包括:进度条构件,对话框构件,
指示对话框
*是否能关闭的标志,以及最新已知的在进度条构件上显示百分比。
*/
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);
}
----------------------------------------------------------------------------------------------------
用编译器的时候,显示错误。。如下
administrator@ubuntu:~/a$ g++ c.cpp -o c `pkg-config --cflags --libs gtk+-
2.0`
c.cpp: 在函数‘void StartProgress()’中:
c.cpp:37:39: 错误: 从类型‘gpointer {aka void*}’到类型‘typProgressData*’
的转换无效 [-fpermissive]
--------------------------------------------------------------------------------------------------- |
|