linux下实现在线升级

ineedchrist 2005-10-29 10:07:16
我一直是在windows下编程的,以前在应用软件中实现过windows下的应用软件在线升级,原理是到指定的服务器请求下载一个应用程序版本配置文件ver.xml,然后根据ver.xml中的描述,确定哪些组件需要升级,然后下载,替换,进行注册等相关操作;
现在要转到linux下编程了,我是linux的新手,对许多概念还不了解,想在linux下也开发这么一个在线升级的东西,并且能够支持命令行操作,升级过程有进度条,在命令行下操作有.号显示进度条,请大家给我思路,如果有源码供我参照,万分感激.谢谢.
我的QQ;303147952
MSN:ineed_christ@hotmail.com
E-mail:joblive@126.com
...全文
310 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
littlebad_boy 2006-02-14
  • 打赏
  • 举报
回复
mark
LDD123 2005-11-01
  • 打赏
  • 举报
回复
mark
yyy790601 2005-11-01
  • 打赏
  • 举报
回复
用gtk很easy了。

#include <gtk/gtk.h>

typedef struct _ProgressData {
GtkWidget *window;
GtkWidget *pbar;
int timer;
gboolean activity_mode;
} ProgressData;

/* 更新进度条,这样就能够看到进度条的移动 */
gint progress_timeout( gpointer data )
{
ProgressData *pdata = (ProgressData *)data;
gdouble new_val;

if (pdata->activity_mode)
gtk_progress_bar_pulse (GTK_PROGRESS_BAR (pdata->pbar));
else
{
/* 使用在调整对象中设置的取值范围计算进度条的值 */

new_val = gtk_progress_bar_get_fraction (GTK_PROGRESS_BAR (pdata->pbar)) + 0.01;

if (new_val > 1.0)
new_val = 0.0;

/* 设置进度条的新值 */
gtk_progress_bar_set_fraction (GTK_PROGRESS_BAR (pdata->pbar), new_val);
}

/* 这是一个timeout函数,返回 TRUE,这样它就能够继续被调用 */
return TRUE;
}

/* 回调函数,切换在进度条你的滑槽上的文本显示 */
void toggle_show_text( GtkWidget *widget,
ProgressData *pdata )
{
const gchar *text;

text = gtk_progress_bar_get_text (GTK_PROGRESS_BAR (pdata->pbar));
if (text && *text)
gtk_progress_bar_set_text (GTK_PROGRESS_BAR (pdata->pbar), "");
else
gtk_progress_bar_set_text (GTK_PROGRESS_BAR (pdata->pbar), "some text");
}

/* 回调函数,切换进度条的活动模式 */
void toggle_activity_mode( GtkWidget *widget,
ProgressData *pdata )
{
pdata->activity_mode = !pdata->activity_mode;
if (pdata->activity_mode)
gtk_progress_bar_pulse (GTK_PROGRESS_BAR (pdata->pbar));
else
gtk_progress_bar_set_fraction (GTK_PROGRESS_BAR (pdata->pbar), 0.0);
}


/* 回调函数,切换进度条的移动方向 */
void toggle_orientation( GtkWidget *widget,
ProgressData *pdata )
{
switch (gtk_progress_bar_get_orientation (GTK_PROGRESS_BAR (pdata->pbar))) {
case GTK_PROGRESS_LEFT_TO_RIGHT:
gtk_progress_bar_set_orientation (GTK_PROGRESS_BAR (pdata->pbar),
GTK_PROGRESS_RIGHT_TO_LEFT);
break;
case GTK_PROGRESS_RIGHT_TO_LEFT:
gtk_progress_bar_set_orientation (GTK_PROGRESS_BAR (pdata->pbar),
GTK_PROGRESS_LEFT_TO_RIGHT);
break;
default:
// 什么也不做
}
}


/* 清除分配的内存,删除定时器(timer) */
void destroy_progress( GtkWidget *widget,
ProgressData *pdata)
{
gtk_timeout_remove (pdata->timer);
pdata->timer = 0;
pdata->window = NULL;
g_free (pdata);
gtk_main_quit ();
}

int main( int argc,
char *argv[])
{
ProgressData *pdata;
GtkWidget *align;
GtkWidget *separator;
GtkWidget *table;
GtkWidget *button;
GtkWidget *check;
GtkWidget *vbox;

gtk_init (&argc, &argv);

/* 为传递到回调函数中的数据分配内存 */
pdata = g_malloc (sizeof (ProgressData));

pdata->window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
gtk_window_set_resizable (GTK_WINDOW (pdata->window), TRUE);

g_signal_connect (G_OBJECT (pdata->window), "destroy",
G_CALLBACK (destroy_progress),
pdata);
gtk_window_set_title (GTK_WINDOW (pdata->window), "GtkProgressBar");
gtk_container_set_border_width (GTK_CONTAINER (pdata->window), 0);

vbox = gtk_vbox_new (FALSE, 5);
gtk_container_set_border_width (GTK_CONTAINER (vbox), 10);
gtk_container_add (GTK_CONTAINER (pdata->window), vbox);
gtk_widget_show (vbox);

/* 创建一个居中对齐的对象 */
align = gtk_alignment_new (0.5, 0.5, 0, 0);
gtk_box_pack_start (GTK_BOX (vbox), align, FALSE, FALSE, 5);
gtk_widget_show (align);

/* 创建进度条 */
pdata->pbar = gtk_progress_bar_new ();

gtk_container_add (GTK_CONTAINER (align), pdata->pbar);
gtk_widget_show (pdata->pbar);

/* 加一个定时器(timer),以更新进度条的值 */
pdata->timer = gtk_timeout_add (100, progress_timeout, pdata);

separator = gtk_hseparator_new ();
gtk_box_pack_start (GTK_BOX (vbox), separator, FALSE, FALSE, 0);
gtk_widget_show (separator);

/* 行数、列数、同质性(homogeneous) */
table = gtk_table_new (2, 2, FALSE);
gtk_box_pack_start (GTK_BOX (vbox), table, FALSE, TRUE, 0);
gtk_widget_show (table);

/* 添加一个复选按钮,以选择是否显示在滑槽里的文本 */
check = gtk_check_button_new_with_label ("Show text");
gtk_table_attach (GTK_TABLE (table), check, 0, 1, 0, 1,
GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL,
5, 5);
g_signal_connect (G_OBJECT (check), "clicked",
G_CALLBACK (toggle_show_text),
pdata);
gtk_widget_show (check);

/* 添加一个复选按钮,切换活动状态 */
check = gtk_check_button_new_with_label ("Activity mode");
gtk_table_attach (GTK_TABLE (table), check, 0, 1, 1, 2,
GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL,
5, 5);
g_signal_connect (G_OBJECT (check), "clicked",
G_CALLBACK (toggle_activity_mode),
pdata);
gtk_widget_show (check);

/* 添加一个复选按钮,切换移动方向 */
check = gtk_check_button_new_with_label ("Right to Left");
gtk_table_attach (GTK_TABLE (table), check, 0, 1, 2, 3,
GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL,
5, 5);
g_signal_connect (G_OBJECT (check), "clicked",
G_CALLBACK (toggle_orientation),
pdata);
gtk_widget_show (check);

/* 添加一个按钮,用来退出应用程序 */
button = gtk_button_new_with_label ("close");
g_signal_connect_swapped (G_OBJECT (button), "clicked",
G_CALLBACK (gtk_widget_destroy),
pdata->window);
gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);

/* 将按钮设置为能缺省的构件 */
GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);

/* 将缺省焦点设置到这个按钮上,使之成为缺省按钮,只要按回车键
* 就相当于点击了这个按钮 */
//译者注: 能缺省的构件在获取焦点后成为缺省构件,用户按方向键等可以切换焦点。
gtk_widget_grab_default (button);
gtk_widget_show (button);

gtk_widget_show (pdata->window);

gtk_main ();

return 0;
}
ineedchrist 2005-11-01
  • 打赏
  • 举报
回复
我要开发就是一个界面,一个按钮,点击“升级”按钮后,把一个链接,比如说http://www.awaman.com/1.rar下载下来,下载过程有进度条!哪位高人帮忙给个例程我研究研究?开发语言用c或c++都行。我的邮箱是joblive@126.com QQ:303147952
yyy790601 2005-11-01
  • 打赏
  • 举报
回复
gcc -o name name.c `pkg-config --cflags --libs gtk+-2.0`

前提是系统安装了gtk开发包,运行时必须在图形环境下。
ineedchrist 2005-11-01
  • 打赏
  • 举报
回复

To:yyy790601

因为我是初学者,初学linux,对GTK编程一无所知(我一直做windows开发的)。您给我写的代码我基本能看懂,但不知道如何在linux下实现,我用Glade Interface Designer试验了一个界面开发的,什么代码也没写,发现存盘的是.sh\.in\.am\.glade等一些文件,我不知道你给我的代码怎么用,你能否把整个的工程文件发给我一份,我看一下?非常感谢你!我的QQ:303147952,MSN:ineed_christ@hotmail.com E-mail:joblive@126.com
yyy790601 2005-10-30
  • 打赏
  • 举报
回复
linux下升级可以不用提示用户先关闭程序的,当然关闭了更稳当,免得某个文件有冲突。

tb01412 2005-10-30
  • 打赏
  • 举报
回复
在命令行下的思路是:
当应用程序启动时,开辟一个线程,用于与指定的服务器建立TCP连接,然后使用HTTP协议下载指定的文件,最后分析这个文件,确定升级某些组件,然后下载那些组件,下载完成后,启动另一专用于升级的程序,在那个程序中提示用户先关闭程序,然后再将下载的相应组件替换旧的版本的相应部分,最后需要说明的是,不需要进行注册之类的操作,只有WINDOWS才有注册表的概念,LINUX下的是配置文件(如果需要并且有配置文件的话)

图形界面下的思路与命令行的思路是一样,没什么区别,只是需要涉及到图形界面编程,你说的那个用进度条或者用"."的方式,只不过是不同的实现方式罢了,在命令行下用打印语句,在图形界面上用控件而已,还需要注意的是在命令行下,由于这个程序的升级部分和主程序部分用的是同一个终端,就出现重叠,解决办法是先关闭主程序部分的输入输出,等待下载完之后,重启那个主程序时,输入输出就自动重新打开的
onelifeonelove 2005-10-29
  • 打赏
  • 举报
回复
假如是JAVA程序,具体没有多大的差别,只需要修改配置的XML文件就可以 了

23,125

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧