我用 WaitForSingleObject 调用了一个cmd命令程序,设置了等待3秒
同时我想在这期间用TTimer 模拟一个执行进度但WaitForSingleObject 锁定了当前主线程,无法实现我的功能
、
很少进行线程编程,请教一下如何?
同时我想在这期间用TTimer 模拟一个执行进度但WaitForSingleObject 锁定了当前主线程,无法实现我的功能
、
很少进行线程编程,请教一下如何?
解决方案 »
- delphi鼠标拖动窗口改变大小 如何让其中的控件随之改变?
- 如何编写组件安装工程?有知道的请进来
- 终于下定决心辞职了,要去上海!那边的兄弟多照应呀……(男人总是要出去闯一闯的!!)
- 关于Microsoft agent(小精灵)的问题,高手近来一起研究研究吧
- 为什么我用TMediaPlayer录音时,有时候得到的wav文件很小,有时就好好的,没有规律
- 多线程提问,create里的参数好像没用的阿?
- 动态创建的数组怎么判断数组的个数?
- 使用QuickReport打印预览时如何设置页面大小!
- 急急!!!向高手请教有关dbgrid中主细表删除问题?????
- 请问如何得到一个外部程序(比如QQ)上的一个按钮的句柄或ID值?
- 关于 调用 DLL 窗口的问题
- 请教一个问题。。。。
循环中间顺便显示执行进度不过,这个进度恐怕是不准的
unit SimulateProcessbar;interface
uses
Windows, ExtCtrls, Classes, ComCtrls, Forms, Dialogs;
type
TSimulateProcessbar = class
private
hThread :THandle;
public
constructor Create(AProgressBar: TProgressBar);
destructor Destroy; override;
procedure Start(AResidue:Double);
procedure Stop;
end;
var
FStopValue :Integer;
FTimer:TTimer;
FProgressBar: TProgressBar;
implementation// --> 这里如果没有WaitForSingleObject,可以进入该事件,在WaitForSingleObject等待期间无法进入
procedure DoOnTimer(Sender: TObject);
begin
with FProgressBar do
begin
if Position < FStopValue then
Position := Position + 1
else
FTimer.Enabled := False;
end;
end;{线程入口函数}
function MyThreadFunc(p: Pointer): Integer; stdcall;
var
FOnTimer: TNotifyEvent;
begin
FTimer := TTimer.Create(nil);
FTimer.Interval := 500;
@FOnTimer := @DoOnTimer;
FTimer.OnTimer := FOnTimer;
FTimer.Enabled := True;
Result := 0;
end;
{ TSimulateProcessbar }
constructor TSimulateProcessbar.Create(AProgressBar: TProgressBar);
begin
FProgressBar := AProgressBar;
hThread := 0;
end;destructor TSimulateProcessbar.Destroy;
begin
if hThread > 0 then
CloseHandle(hThread);
if Assigned(FTimer) then
begin
FTimer.Enabled := False;
FTimer.Free;
end;
inherited;
end;
procedure TSimulateProcessbar.Start(AResidue:Double);
var
ID: DWORD;
begin
FStopValue := Round(FProgressBar.Position + (FProgressBar.Max - FProgressBar.Position) * AResidue );
if hThread = 0 then
hThread := CreateThread(nil, 0, @MyThreadFunc, nil, CREATE_SUSPENDED, ID);
ResumeThread(hThread);
end;procedure TSimulateProcessbar.Stop;
begin
SuspendThread(hThread);
if Assigned(FTimer) then
begin
if FTimer.Enabled then
FTimer.Enabled := False;
with FProgressBar do
if Position < FStopValue then
Position := FStopValue;
FTimer.Free;
end;
FTimer := nil;
end;end.
var
ID: DWORD;
begin
FStopValue := Round(FProgressBar.Position + (FProgressBar.Max - FProgressBar.Position) * AResidue );
if hThread = 0 then
begin
hThread := CreateThread(nil, 0, @MyThreadFunc, nil, CREATE_SUSPENDED, ID);
SetThreadPriority(hThread, THREAD_PRIORITY_HIGHEST); // 设置优先级为最高
end;
ResumeThread(hThread);
end;
主程序只是根据cmd进程id,不断判断它是不是运行完了