当前位置:  技术问答>linux和unix

linux下实现在线升级

    来源: 互联网  发布时间:2015-11-09

    本文导语:  我一直是在windows下编程的,以前在应用软件中实现过windows下的应用软件在线升级,原理是到指定的服务器请求下载一个应用程序版本配置文件ver.xml,然后根据ver.xml中的描述,确定哪些组件需要升级,然后下载,替换,进行注...

我一直是在windows下编程的,以前在应用软件中实现过windows下的应用软件在线升级,原理是到指定的服务器请求下载一个应用程序版本配置文件ver.xml,然后根据ver.xml中的描述,确定哪些组件需要升级,然后下载,替换,进行注册等相关操作;
现在要转到linux下编程了,我是linux的新手,对许多概念还不了解,想在linux下也开发这么一个在线升级的东西,并且能够支持命令行操作,升级过程有进度条,在命令行下操作有.号显示进度条,请大家给我思路,如果有源码供我参照,万分感激.谢谢.
我的QQ;303147952
MSN:ineed_christ@hotmail.com
E-mail:joblive@126.com

|
用gtk很easy了。

#include 

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;
}

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

图形界面下的思路与命令行的思路是一样,没什么区别,只是需要涉及到图形界面编程,你说的那个用进度条或者用"."的方式,只不过是不同的实现方式罢了,在命令行下用打印语句,在图形界面上用控件而已,还需要注意的是在命令行下,由于这个程序的升级部分和主程序部分用的是同一个终端,就出现重叠,解决办法是先关闭主程序部分的输入输出,等待下载完之后,重启那个主程序时,输入输出就自动重新打开的

|
假如是JAVA程序,具体没有多大的差别,只需要修改配置的XML文件就可以 了

|
mark

    
 
 

您可能感兴趣的文章:

  • 高分征集linux下程序在线升级方案!
  • 我在www.chinaunix.net下载的Suse Linux 10.1 能免费在线升级吗?能永远免费使用吗?
  • 如何在线升级Linux?
  • 在线请教:linux下用MySQL C API 连接MySQL 4.1.12出现的连接问题,提示升级客户端!!!!!!
  • linux为什么要升级内核?升级内核有何作用?
  • 升级linux2.6的内核,还需要升级mkinitrd吗?
  • Red Hat linux 9 内核升级 2.4.480------>2.6.6,升级前要作哪些系统备份?
  • Red Hat linux 9 内核升级 2.4.480------>2.6.6,升级完之后系统不能启动,这是为什么?
  • 升级linux kernel
  • 如何升级红帽linux
  • 请问:linux2.4能不能升级到2.6呀
  • 在Linux下升级PHP4要注意什么?
  • Linux 2.4.20-8 升级到 Linux 2.6.18之后的问题
  • 升级redhat linux的问题
  • 为什么我升级LINUX的内核老是不成功呀!谁能帮帮我呀
  • linux内核升级后启动出错
  • linux 内核升级问题,
  • 谁能给我一个linux2.4升级到2.6内核的成功文章呢
  • linux as 4 32位升级到64位
  • linux升级问题
  • Linux:内核升级
  • Linux自动升级拉内核
  • 升级Linux的问题,急!请高手帮忙!
  • 可以介绍一下怎么使用RHN 来升级linux系统吗?
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • linux下通过crond实现自动执行程序
  • Linux和Unix相对WIN、NETWARE有什么好处?他们之间有什么区别?WIN、NETWARE能实现的功能LINUX和UNIX能实现吗?
  • Linux下c函数dlopen实现加载动态库so文件代码举例
  • linux下如实现与window下的驱动器实现文件共享??
  • Linux内存文件系统(ramdisk)的三种实现方式
  • 操作系统 iis7站长之家
  • linux内存文件系统ramfs实现原理
  • 在linux下如何编程实现nslookup命令实现的IP地址和域名互相转换的功能?
  • Linux 共享内存介绍及实现代码
  • 我需要一个模型,在 LINUX C 下。实现线程间的控制,执行,阻塞,再执行。。。。。不知道如何实现。
  • linux下grep命令实现查找多个关键字(与关系和或关系)
  • 我想做linux下的还原备份,实现与还原精灵虚拟还原等一样的功能,应该怎么做?另外现在有实现这种功能的成熟产品是哪一种?
  • Linux下C语言strstr()查找子字符串位置函数详细介绍(strstr原型、实现及用法)
  • 关于linux c程序实现自动实现telnet的问题
  • Linux c socket编程:简单的客户端(client)和服务端(server)实现
  • 请问高手linux中用md5来实现一串字符串的加密,用c++/c实现
  • 在linux实现在任意给定的目录查找文需要的件的程序? 下面的实现思路可不可以呢????
  • 请问:有没有人在Linux下实现过计费网关?
  • 关于XP系统下批处理文件如何实现执行linux下脚本,从而实现版本的自动化编译
  • 如何在linux下实现event事件机制
  • Linux音频, Linux下能否实现 实时语音聊天 ?
  • linux c/c++ IP字符串转换成可比较大小的数字
  • 在win分区上安装linux和独立分区安装linux有什么区别?可以同时安装吗?(两个linux系统)
  • linux哪个版本好?linux操作系统版本详细介绍及选择方案推荐
  • 在虚拟机上安装的linux上,能像真的linux系统一样开发linux程序么?
  • secureCRT下Linux终端汉字乱码解决方法
  • 我重装window后,把linux的引导区覆盖了,进不了linux怎么办?急啊,望热心的人帮助 (现在有linux的盘)
  • Linux c字符串中不可打印字符转换成16进制
  • 安装vmware软件,不用再安装linux系统,就可以模拟linux系统了,然后可以在其上学习一下LINUX下的基本操作 了?
  • Linux常用命令介绍:更改所属用户群组或档案属性
  • 红旗Linux主机可以通过127.0.0.1访问,但如何是连网的Win2000机器通过Linux的IP去访问Linux


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3