implementationvar
hHandle: THandle;
I: Integer;
pt: TPoint;{$R *.dfm}procedure TForm1.FormMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
var
ID: DWORD;
begin
pt.X := X;
pt.Y := Y;
CreateThread(nil, 0, @ThreadRun, Pointer(@pt), 0, ID);
end; //运行到这里时@pt内存为 $D7B7A0procedure ThreadRun(p: Pointer); //但传进来后p内存为 $76F9ED5A
var
X, Y: Integer;
I: Integer;
pt2: TPoint;
begin
pt2 := PPoint(p)^;
X := pt2.X;
Y := pt2.Y;
for I := 0 to 1000000 do
with Form1.Canvas do
begin
Lock;
TextOut(X, Y, IntToStr(I));
Unlock;
end;
end;end.请问为什么往过程里传递指针 给变了~~
hHandle: THandle;
I: Integer;
pt: TPoint;{$R *.dfm}procedure TForm1.FormMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
var
ID: DWORD;
begin
pt.X := X;
pt.Y := Y;
CreateThread(nil, 0, @ThreadRun, Pointer(@pt), 0, ID);
end; //运行到这里时@pt内存为 $D7B7A0procedure ThreadRun(p: Pointer); //但传进来后p内存为 $76F9ED5A
var
X, Y: Integer;
I: Integer;
pt2: TPoint;
begin
pt2 := PPoint(p)^;
X := pt2.X;
Y := pt2.Y;
for I := 0 to 1000000 do
with Form1.Canvas do
begin
Lock;
TextOut(X, Y, IntToStr(I));
Unlock;
end;
end;end.请问为什么往过程里传递指针 给变了~~
解决方案 »
- 关于getcurrentdir的问题
- 用ADOQery或ADOStroedProc怎样写查询语句超过255个字符
- N久N久没发过贴了,提问一下有没有delphi有没有一个类似Listbox似的可视的控件容器?
- 做医疗软件的进来看看,散分了。
- 请问xml格式得文件中得文本换行怎么实现啊,谢谢
- 公式分析,救急!!
- delphi高手们,请帮个忙吧,重分酬谢
- 请帮帮我,我在做项目,但是有个问题啊!!!
- 我用delph5.0编写的三层结构的程序里,不能实现调用有参数的函数
- delphi xe 移动开发有么有前途?
- IIS 7.5下如何配置ISAPI应用程序啊?
- 俺不懂数组,请问这个帖子中有关数组的,该如何处理?
哦。。这个不是dll里用的嘛?这里为什么需要呢?能不能解释一下哈
delphi中永远不要使用createthread来创建线程,使用 beginthread 来创建。
如果使用c++,也不要使用api createthread 来创建显示,应使用_beginthreadex。
_beginthread需要_cdecl的线程函数地址,_beginthreadex和_CreateThread需要_stdcall 的线程函数地址
哦。。这个不是dll里用的嘛?这里为什么需要呢?能不能解释一下哈函数的入栈方式决定
type
PThreadRec = ^TThreadRec;
TThreadRec = record
Func: TThreadFunc;
Parameter: Pointer;
end;
{$IFDEF MSWINDOWS}
function ThreadWrapper(Parameter: Pointer): Integer; stdcall;
{$ELSE}
function ThreadWrapper(Parameter: Pointer): Pointer; cdecl;
{$ENDIF}{$IFDEF MSWINDOWS}
function BeginThread(SecurityAttributes: Pointer; StackSize: LongWord;
ThreadFunc: TThreadFunc; Parameter: Pointer; CreationFlags: LongWord;
var ThreadId: LongWord): Integer;
var
P: PThreadRec;
begin
New(P);
P.Func := ThreadFunc;
P.Parameter := Parameter;// 把回调函数及其参数指针重新封装到一个结构体内
IsMultiThread := True; // 把全局变量IsMultiThread设为True
// 最后也是调用了CreateThread
Result := CreateThread(SecurityAttributes, StackSize, @ThreadWrapper, P,
CreationFlags, ThreadID);
end;......
(*
这就是为什么delphi中要用beginthread替代createthread的原因c++的理由也一样
四、为什么用_beginthreadex而不是CreateThread?
为什么要用C运行时库的_beginthreadex代替操作系统的CreateThread来创建线程?来源自自1999年7月MSJ杂志的《Win32 Q&A》栏目你也许会说我一直用CreateThread来创建线程,一直都工作得好好的,为什么要用_beginthreadex来代替CreateThread,下面让我来告诉你为什么。回答一个问题可以有两种方式,一种是简单的,一种是复杂的。如果你不愿意看下面的长篇大论,那我可以告诉你简单的答案:_beginthreadex在内部调用了CreateThread,在调用之前_beginthreadex做了很多的工作,从而使得它比CreateThread更安全。《windows 核心编程》第6章也有说明。*)