首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > .NET >

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

2013-07-08 
点击最小化或最大化按钮不松开,为什么线程停止了?点击最小化或最大化按钮不松开,为什么线程停止了?具体程

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

具体程序如下,线程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就行了。

热点排行