还是多线程问题

tjj5203 2009-12-28 05:03:11

unit Unit1;

interface

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

const
MyMessage =WM_USER+101;

type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
procedure AddStrPro(Var Message:TMessage);message MyMessage;
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;
ThreadID:DWORD;
ThreadHandle:THandle;
mark:Boolean=True;
t:Integer=1;
implementation

{$R *.dfm}
function DataRecv(p: Pointer): DWORD; stdcall;
var i:Integer;
begin
while True do
begin
if Mark=False then
Break;
SendMessage(Form1.Handle,MyMessage,1,1);
Sleep(100);
end;
end;

procedure TForm1.AddStrPro(var Message: TMessage);
var
i:Integer;
begin
Application.ProcessMessages;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
ThreadHandle:= CreateThread(nil, 0, @DataRecv, nil, 0, ThreadID);
end;

end.

跟前几天的类似。
点击Button1后不能响应最大,最小,关闭按钮,其他正常!寻求解答
...全文
125 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
dd_zhouqian 2009-12-29
  • 打赏
  • 举报
回复
SendMessage->PostMessage
tjj5203 2009-12-29
  • 打赏
  • 举报
回复
顶个,没解决啊。。。。。。。。。。
tjj5203 2009-12-29
  • 打赏
  • 举报
回复
哎,看来还是结贴吧
tjj5203 2009-12-28
  • 打赏
  • 举报
回复
这个只是我的简单的测试程序啊,在本来的程序中AddStrPro做了很多的事情,会产生许多的进队消息,我的本意是想在下次sendmessage前处理掉这些消息。而我想知道的就是为什么加了application.process关闭按钮会无效,点击关闭按钮后,产生的第一个wm_nclbutton是进队的啊
willflyz 2009-12-28
  • 打赏
  • 举报
回复
SendMessage发送的消息不会进消息队列,所以没必要再调用Application.ProcessMessages了
xzhifei 2009-12-28
  • 打赏
  • 举报
回复
关键在于你在消息响应的地方使用了Application.ProcessMessages,你换成其它的都不会出现现在的问题。

原因可能是Application.ProcessMessages忽略掉了标题上的按钮消息。
willflyz 2009-12-28
  • 打赏
  • 举报
回复
怎么我测试都是正常的,我还在Form上面加了一个Edit让它显示循环的次数,最大,最小跟关闭按钮正常哦,都不用加Application.ProcessMessages;你看看下面的代码,我在D7下面测试的。

unit Unit1;

interface

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

const
MyMessage =WM_USER+101;

type
TForm1 = class(TForm)
Button1: TButton;
Edit1: TEdit;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
procedure AddStrPro(var Message: TMessage);message MyMessage;
public
{ Public declarations }
end;

var
Form1: TForm1;
ThreadID:DWORD;
ThreadHandle:THandle;
mark:Boolean=True;
t:Integer=1;

implementation

{$R *.dfm}

function DataRecv(p: Pointer): DWORD; stdcall;
var
i:Integer;
begin
while True do
begin
if Mark=False then
Break;
SendMessage(Form1.Handle,MyMessage,1,1);
Sleep(100);
end;
end;

procedure TForm1.AddStrPro(var Message: TMessage);
begin
Edit1.Text := IntToStr(t);
Inc(t);
t := t mod 10000;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
ThreadHandle:= CreateThread(nil, 0, @DataRecv, nil, 0, ThreadID);
end;

end.

tjj5203 2009-12-28
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 dinoalex 的回复:]
引用 3 楼 tjj5203 的回复:
引用 2 楼 xzhifei 的回复:
SendMessage换成PostMessage

我想知道原因,况且我用的程序只适合用sendmessage,postmessage会在消息队列排队


原因是sendmessage发送消息后,要等待执行完
而postmessage发送消息后就不管了,也就是不用等
[/Quote]
你这样也解释不了为什么不能响应 最大,最小跟关闭按钮啊
其他消息正常
dinoalex 2009-12-28
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 tjj5203 的回复:]
引用 2 楼 xzhifei 的回复:
SendMessage换成PostMessage

我想知道原因,况且我用的程序只适合用sendmessage,postmessage会在消息队列排队
[/Quote]

原因是sendmessage发送消息后,要等待执行完
而postmessage发送消息后就不管了,也就是不用等
tjj5203 2009-12-28
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 xzhifei 的回复:]
SendMessage换成PostMessage
[/Quote]
我想知道原因,况且我用的程序只适合用sendmessage,postmessage会在消息队列排队
xzhifei 2009-12-28
  • 打赏
  • 举报
回复
SendMessage换成PostMessage
tjj5203 2009-12-28
  • 打赏
  • 举报
回复
顶个,别沉了,大家都来看看

5,388

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧