读书人

点击最小化或最大化旋钮不松开为什么

发布时间: 2013-07-08 14:13:00 作者: rapoo

点击最小化或最大化按钮不松开,为什么线程停止了?
点击最小化或最大化按钮不松开,为什么线程停止了?

具体程序如下,线程1用于在FORM上写数字,线程2用于在IMAGE上写数字,程序运行时把鼠标放在窗体的最大化或最小化按钮上,点击一下鼠标左键但不要松开鼠标左键,此时FORM上写的数字还在继续走动,而image上写的数字竟然停下来了,这是为什么?如何避免这种情况出现?当鼠标点击按钮并不松开时,如何让程序继续运行而不受影响呢?

--------------------------------------


unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls, jpeg;

type
TForm1 = class(TForm)
btn1: TButton;
lbl1: TLabel;
img1: TImage;
procedure btn1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
type
TMyThread1 = class(TThread)
protected
procedure Execute; override;
end;
type
TMyThread2 = class(TThread)
private
FValue:integer;
protected
procedure Execute; override;
procedure MyVCLAction;
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TMyThread1.Execute;
var
i: Integer;
begin
FreeOnTerminate := True; {这可以让线程执行完毕后随即释放}
for i := 0 to 500000 do
begin
Form1.Canvas.Lock;
Form1.Canvas.TextOut(10, 10, IntToStr(i));
Form1.Canvas.Unlock;
end;
end;

procedure TMyThread2.Execute;
var
i: Integer;
begin
FreeOnTerminate := True; {这可以让线程执行完毕后随即释放}
for i := 0 to 500000 do
begin
FValue := i;
Synchronize(MyVCLAction);
end;
end;

procedure TMyThread2.MyVCLAction;
begin
Form1.img1.Canvas.TextOut(10, 10, IntTostr(FVAlue));
end;

procedure TForm1.btn1Click(Sender: TObject);
var
ID: THandle;
begin
TMyThread1.Create(False);
TMyThread2.Create(False);
end;


[解决办法]
自己用TButton替换掉右上角的三个按钮
[解决办法]
跟踪测试一下看看吧

[解决办法]
应该是因为你线程2中用了Synchronize导致,你去掉试下:

procedure TMyThread2.Execute;
var
i: Integer;
begin
FreeOnTerminate := True; {这可以让线程执行完毕后随即释放}
for i := 0 to 500000 do
begin
FValue := i;
MyVCLAction;
end;
end;

procedure TMyThread2.MyVCLAction;
begin
Form1.img1.Canvas.Lock;
Form1.img1.Canvas.TextOut(10, 10, IntTostr(FVAlue));
Form1.img1.Canvas.Unlock;
end;
[解决办法]

引用:
这样试了一下,image上的数字出现无规律的变化几下就停住了,没有从1到50000这一连续变化的过程~


试下用发送消息给主程式来画image的数字
[解决办法]
之前我试过一个:
对于Windows下的程序,如复制。在标题栏上按住左键,可以正常运行,如果按住右键,就停住了。
至于楼主写的程序,按住右键应该也会停住吧。
[解决办法]
To 4L:
隐藏掉原来的标题栏啊。自己用TPanel,上面放三个按钮,模拟原来的标题栏。
[解决办法]
屏蔽掉最大最小化按钮的mousedown消息,有mouseup就行了。

读书人网 >.NET

热点推荐