窗口显示后更新的问题! (50分)

  • 主题发起人 主题发起人 狼牙
  • 开始时间 开始时间

狼牙

Unregistered / Unconfirmed
GUEST, unregistred user!
我想让一个程序运行后,弹出一个窗体,下面有进度条,用一个timer来控制progress的
增长,而同时用winexec在背后运行B程序,但发现似乎无法实现。。。
将procedure init如果放在form.show中,窗口将不会弹出,B程序却放在了
前面,而且在B程序运行的过程中form在任务栏也无法切换到桌面上,
请问大家有什么好办法没有?
 
application.restore;
setforegroudwindow(handle)
 
楼上没懂我的意思,我的意思是:
我的意思是让一个程序运行后弹出一个窗体,窗体中有个进度条,然后让那个进度条一直
增长,同时,在增长的时候,winexec一个很大的自解压缩文件,让她在后台运行,一直
到结束,这当中,progress一直涨,涨到100就跳回0。但是,在自解压文件释放的时候,
我的窗体无法在最前头显示,而且进度条静止不再增长。
 
我一般用两种方法:
1、在form1.onmousemove中执行 ini
2、设置一个timer中执行ini
当然都要判断只执行一次
 
不管实在time还是onmousemove中执行都是一样,进度条不动,后台自解压文件运行,
主窗体僵硬!无法切换。。。。何解。。。
 
刚才的两条语句就是使窗体跑到前台啊

还有你在timer事件中最好来上一句application.postmessage;好像是这个吧
 
那可是后台程序的问题。
1、使用线程
2、后台程序中加入application.postmessage
 
我贴上代码,大家看一看,不管如何,只要运行到WinExecAndWait32,进度条就静止不动,
主程序也无法动了。
unit main;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, Grids, DBGrids, RXDBCtrl, DB,StdCtrls, inifiles, TLHelp32,
ExtCtrls,Registry, ADODB, Gauges, DBCtrls;

type
TF_main = class(TForm)
Timer1: TTimer;
Gauge1: TGauge;
Label1: TLabel;
procedure FormCreate(Sender: TObject);
procedure Timer1Timer(Sender: TObject);
procedure FormShow(Sender: TObject);
private
{ Private declarations }
public
MyIni: Tinifile;
function GetExePath(): string;
function Update(): boolean;
procedure FlowWorkTo();
procedure InitiCS();
procedure RunAtStartup(Key, Value: String);
{ Public declarations }
end;

var
F_main: TF_main;

implementation

{$R *.dfm}

{ TF_main }

function WinExecAndWait32(FileName: string; Visibility: integer): dword;
var
zAppName: array[0..512] of char;
zCurDir: array[0..255] of char;
WorkDir: string;
StartupInfo: TStartupInfo;
ProcessInfo: TProcessInformation;
begin
StrPCopy(zAppName, FileName);
GetDir(0, WorkDir);
StrPCopy(zCurDir, WorkDir);
FillChar(StartupInfo, Sizeof(StartupInfo), #0);
StartupInfo.cb := Sizeof(StartupInfo);

StartupInfo.dwFlags := STARTF_USESHOWWINDOW;
StartupInfo.wShowWindow := Visibility;
if not CreateProcess(nil,
zAppName, { pointer to command line string }
nil, { pointer to process security attributes }
nil, { pointer to thread security attributes }
false, { handle inheritance flag }
CREATE_NEW_CONSOLE or { creation flags }
NORMAL_PRIORITY_CLASS,
nil, { pointer to new environment block }
nil, { pointer to current directory name }
StartupInfo, { pointer to STARTUPINFO }
ProcessInfo) then
Result := 0 { pointer to PROCESS_INF }
else
begin
WaitforSingleObject(ProcessInfo.hProcess, INFINITE);
GetExitCodeProcess(ProcessInfo.hProcess, Result);
end;
end;

function TF_main.GetExePath: string;
begin
Result := ExtractFilePath(ParamStr(0));
if Result[Length(Result)] <> '/' then
Result := Result + '/';
end;

procedure TF_main.FormCreate(Sender: TObject);
var
cs,sc: string;
dbpath:string;
begin
Randomize;
end;

function TF_main.Update: boolean;
var
AppProPath: string;
begin
result:=true;
try
AppProPath := GetExePath+'ProPath.exe'; //取得路径
if fileexists(AppProPath) then
begin
try
WinExecAndWait32(AppProPath, 1);
// winexec(pchar(AppProPath),SW_SHOWNORMAL);
sleep(1000);//赞停1秒继续执行
except
result:=false;
end;
end
else
result:=false;
// raise exception.Create(
// '升级失败!原因可能是升级文件不存在或文件已被破坏!');
finally
sleep(1000);//赞停1秒继续执行
end;

end;

procedure TF_main.FlowWorkTo;
begin
UpdateGame//如果升级成功
timer1.Enabled:=false;
application.Terminate;//退出程序
end;

procedure TF_main.Timer1Timer(Sender: TObject);
begin
if Gauge1.Progress<100 then
Gauge1.Progress:=Gauge1.Progress+random(10)
else Gauge1.Progress:=0;
end;

procedure TF_main.FormShow(Sender: TObject);
begin
Timer1.Enabled:=true;
InitiCS;
FlowWorkTo;
end;

end.

 
WaitforSingleObject就是在等待,他的本领就是:
啥也别做,等CreateProcess的进程结束。
 
WaitForSingleObject错了
 
不行了,要死了。我创建了一个线程,线程中执行的是WinExecAndWait32.
依然无效啊。昏了。
谁来救救我。。。
WinExecAndWait32的作业是运行完才返回,
我换了winexec,shellexecute也是一样,问题是,我就是需要她运行完后返回,但我的
主程序要有个进度条显示啊,要不,别人还以为你死机了啊。唉。。昏,。
哪位高手来。
 
我知道‘WaitforSingleObject就是在等待,他的本领就是:
啥也别做,等CreateProcess的进程结束。’
但我是要实现等她运行完后返回主程序,我再执行另一个任务,否则,她还没解压完,
我执行任务就会出错啊,但是,它在自解压的时候,需要有个进度条啊,否则,就像死
机了一样,那客户还不扁你啊。。。。。
 
无法解决的问题,征求答案中。。。
 
如果是解压缩,有控件可以完成,可以显示进度的。
我曾经用过vclzip和zipMagic.
如果实在无法显示进度。可以设置某个标准,解压完成后写这个标志。
主程序使用定时器读这个标志。就别用WaitforSingleObject了。
 
各位兄台,即使不用winexecwaitfor32,也是一样的,明白我的意思,进度条依然不能动,
我用了线程执行winexec和用线程增长progress都没有用。。。昏了。。。
 
我们先找个最简单的办法
去掉
WaitforSingleObject(ProcessInfo.hProcess, INFINITE);
GetExitCodeProcess(ProcessInfo.hProcess, Result);
这两句,
使用你的的程序的定时器,等待解压的时间,你应该能估计的。
这样你的界面应该有响应的。

同时,定时器也可以来控制progressbar
 
我不使用winexecwait32,直接winexec,同样的,执行那个后台解压程序,进度条静止。。。
 
这就真奇怪了。
 
用shellexecute呢?
至于主程序无法显示在最前,试试把后台解压程序隐藏
 
后台解压程序是完全隐藏模式,但很气愤,只要一运行,前台就静止。。
 
后退
顶部