| 订阅 | 在线投稿
分享
 
 
 

WIN32下DELPHI中的多线程【变量存储】(三)

2006-12-12 19:18:08 编辑來源:互联网 国际版 评论
 
 
  线程中的变量

   由于每个线程都代表了一个不同的执行路径,因此,最好有一种只限于一个线程内部使用的数据,

   要实现上述目的有以下几种方式:

   1、局部变量(基于栈),很简单,在你的线程函数中你定义的变量既是如此。由于每个线程都在各自的栈中,各个线程将都有一套局部变量的副本,这样,就不会相互影响。对于那些只在过程或函数的生存期有意义的变量,应当把它们声明为局部变量。

   2、存储在线程对象中。还记得CreateThread函数中的lpParameter参数吗,它可以接受一个无类型的指针。结合本文第一章的内容,你应该还记得,它被存储在线程内核对象的上下文结构中,你可以通过CONTEXT结构中的CONTEXT_INTEGER部分的ebx来读取它的地址。

   下面是一段示例代码,用来演示读取CONTEXT结构,这段代码一般用不到,但它可以说明CrateThread函数中的lpParameter被存储的位置

WIN32下DELPHI中的多线程【变量存储】(三)
WIN32下DELPHI中的多线程【变量存储】(三)
...{

WIN32下DELPHI中的多线程【变量存储】(三)
作者:wudi_1982

WIN32下DELPHI中的多线程【变量存储】(三)
联系方式:wudi_1982@hotmail.com

WIN32下DELPHI中的多线程【变量存储】(三)
转载请著名出处,本代码为演示代码,只贴出了一些关键部分

WIN32下DELPHI中的多线程【变量存储】(三)
}

WIN32下DELPHI中的多线程【变量存储】(三)


WIN32下DELPHI中的多线程【变量存储】(三)
type

WIN32下DELPHI中的多线程【变量存储】(三)
//传递给线程函数的结构和指针的声明

WIN32下DELPHI中的多线程【变量存储】(三)
Tinfo = record

WIN32下DELPHI中的多线程【变量存储】(三)
count : integer;

WIN32下DELPHI中的多线程【变量存储】(三)
x : integer;

WIN32下DELPHI中的多线程【变量存储】(三)
y : integer;

WIN32下DELPHI中的多线程【变量存储】(三)
end;

WIN32下DELPHI中的多线程【变量存储】(三)
Pinfo= ^Tinfo;

WIN32下DELPHI中的多线程【变量存储】(三)


WIN32下DELPHI中的多线程【变量存储】(三)
var

WIN32下DELPHI中的多线程【变量存储】(三)
MyThreadHad : THandle;//一个全局变量,用来保存线程的句柄

WIN32下DELPHI中的多线程【变量存储】(三)


WIN32下DELPHI中的多线程【变量存储】(三)
//线程函数

WIN32下DELPHI中的多线程【变量存储】(三)
function MyThread(info : Pointer):DWORD; stdcall;

WIN32下DELPHI中的多线程【变量存储】(三)
var

WIN32下DELPHI中的多线程【变量存储】(三)
i : integer;

WIN32下DELPHI中的多线程【变量存储】(三)
begin

WIN32下DELPHI中的多线程【变量存储】(三)
//根据传递来信息决定在窗口的那个位置输出什么信息

WIN32下DELPHI中的多线程【变量存储】(三)
for i := 0 to Pinfo(info)^.count-1 do

WIN32下DELPHI中的多线程【变量存储】(三)
Form1.Image1.Canvas.TextOut(Pinfo(info)^.x,Pinfo(info)^.y,inttostr(i));

WIN32下DELPHI中的多线程【变量存储】(三)
//FreeMem(info);

WIN32下DELPHI中的多线程【变量存储】(三)
Result := 0;

WIN32下DELPHI中的多线程【变量存储】(三)
end;

WIN32下DELPHI中的多线程【变量存储】(三)


WIN32下DELPHI中的多线程【变量存储】(三)
//创建一个线程

WIN32下DELPHI中的多线程【变量存储】(三)
procedure TForm1.Button4Click(Sender: TObject);

WIN32下DELPHI中的多线程【变量存储】(三)
var

WIN32下DELPHI中的多线程【变量存储】(三)
ppi : Pinfo;

WIN32下DELPHI中的多线程【变量存储】(三)
MyThreadId : DWORD;

WIN32下DELPHI中的多线程【变量存储】(三)
begin

WIN32下DELPHI中的多线程【变量存储】(三)
//分配空间并赋初值

WIN32下DELPHI中的多线程【变量存储】(三)
ppi :=AllocMem(sizeof(tinfo));

WIN32下DELPHI中的多线程【变量存储】(三)
ppi^.count := 1000000;

WIN32下DELPHI中的多线程【变量存储】(三)
ppi^.x := 10;

WIN32下DELPHI中的多线程【变量存储】(三)
ppi^.y := 10;

WIN32下DELPHI中的多线程【变量存储】(三)
//创建

WIN32下DELPHI中的多线程【变量存储】(三)
MyThreadHad := CreateThread(nil,0,@MyThread,ppi,CREATE_SUSPENDED,MyThreadId);

WIN32下DELPHI中的多线程【变量存储】(三)
//在窗体上显示线程函数的地址和传递给它的参数的地址

WIN32下DELPHI中的多线程【变量存储】(三)
labThreadAddr.Caption := inttostr( integer(@MyThread));

WIN32下DELPHI中的多线程【变量存储】(三)
labThreadPvparam.Caption := inttostr(integer(ppi));

WIN32下DELPHI中的多线程【变量存储】(三)
end;

WIN32下DELPHI中的多线程【变量存储】(三)


WIN32下DELPHI中的多线程【变量存储】(三)
//读取CONTEXT结构,注意CONTEXT结构是和CPU有关的,我这里测试时,工作在intel的CPU上

WIN32下DELPHI中的多线程【变量存储】(三)
procedure TForm1.btnRContextClick(Sender: TObject);

WIN32下DELPHI中的多线程【变量存储】(三)
var

WIN32下DELPHI中的多线程【变量存储】(三)
con : _CONTEXT;

WIN32下DELPHI中的多线程【变量存储】(三)
begin

WIN32下DELPHI中的多线程【变量存储】(三)
//初始化结构

WIN32下DELPHI中的多线程【变量存储】(三)
con.ContextFlags := CONTEXT_FULL;

WIN32下DELPHI中的多线程【变量存储】(三)
//读取

WIN32下DELPHI中的多线程【变量存储】(三)
GetThreadContext(MyThreadHad,con);

WIN32下DELPHI中的多线程【变量存储】(三)
//显示在窗体的listbox上

WIN32下DELPHI中的多线程【变量存储】(三)
with lbxContextInfo.Items do

WIN32下DELPHI中的多线程【变量存储】(三)
begin

WIN32下DELPHI中的多线程【变量存储】(三)
// Clear;

WIN32下DELPHI中的多线程【变量存储】(三)
Add('------------CONTEXT--------------');

WIN32下DELPHI中的多线程【变量存储】(三)
Add('');

WIN32下DELPHI中的多线程【变量存储】(三)
Add('CONTEXT_DEBUG_REGISTERS-----');

WIN32下DELPHI中的多线程【变量存储】(三)
Add('dr0:'+#9+IntToStr(con.Dr0));

WIN32下DELPHI中的多线程【变量存储】(三)
Add('dr1:'+#9+IntToStr(con.Dr1));

WIN32下DELPHI中的多线程【变量存储】(三)
Add('dr2:'+#9+IntToStr(con.Dr2));

WIN32下DELPHI中的多线程【变量存储】(三)
Add('dr3:'+#9+IntToStr(con.Dr3));

WIN32下DELPHI中的多线程【变量存储】(三)
Add('dr6:'+#9+IntToStr(con.Dr6));

WIN32下DELPHI中的多线程【变量存储】(三)
Add('dr7:'+#9+IntToStr(con.Dr7));

WIN32下DELPHI中的多线程【变量存储】(三)
add('CONTEXT_SEGMENTS---------');

WIN32下DELPHI中的多线程【变量存储】(三)
Add('segGs:'+#9+inttostr(con.SegGs));

WIN32下DELPHI中的多线程【变量存储】(三)
Add('segFs:'+#9+inttostr(con.Segfs));

WIN32下DELPHI中的多线程【变量存储】(三)
Add('segEs:'+#9+inttostr(con.Seges));

WIN32下DELPHI中的多线程【变量存储】(三)
Add('segDs:'+#9+inttostr(con.Segds));

WIN32下DELPHI中的多线程【变量存储】(三)
Add('CONTEXT_INTEGER.---------');

WIN32下DELPHI中的多线程【变量存储】(三)
Add('edi: '+#9+IntToStr(con.Edi));

WIN32下DELPHI中的多线程【变量存储】(三)
Add('esi: '+#9+IntToStr(con.Esi));

WIN32下DELPHI中的多线程【变量存储】(三)
Add('ebx: '+#9+IntToStr(con.Ebx));

WIN32下DELPHI中的多线程【变量存储】(三)
Add('edx: '+#9+IntToStr(con.Edx));

WIN32下DELPHI中的多线程【变量存储】(三)
Add('ecx: '+#9+IntToStr(con.Ecx));

WIN32下DELPHI中的多线程【变量存储】(三)
Add('eax: '+#9+IntToStr(con.Eax));

WIN32下DELPHI中的多线程【变量存储】(三)
Add('CONTEXT_CONTROL----------');

WIN32下DELPHI中的多线程【变量存储】(三)
Add('Ebp: '+#9+IntToStr(con.Ebp));

WIN32下DELPHI中的多线程【变量存储】(三)
Add('Eip: '+#9+IntToStr(con.Eip));

WIN32下DELPHI中的多线程【变量存储】(三)
Add('segcs: '+#9+IntToStr(con.SegCs));

WIN32下DELPHI中的多线程【变量存储】(三)
Add('EFlags: '+#9+IntToStr(con.EFlags));

WIN32下DELPHI中的多线程【变量存储】(三)
Add('Esp: '+#9+IntToStr(con.Esp));

WIN32下DELPHI中的多线程【变量存储】(三)
Add('SegSs: '+#9+IntToStr(con.SegSs));

WIN32下DELPHI中的多线程【变量存储】(三)
end;

WIN32下DELPHI中的多线程【变量存储】(三)


WIN32下DELPHI中的多线程【变量存储】(三)
end;

WIN32下DELPHI中的多线程【变量存储】(三)


WIN32下DELPHI中的多线程【变量存储】(三)


   把上面代码整理之后,添加到你的程序中,你可以发现(如果也是intel的CPU),那么你可以从Eax寄存器读取到线程函数的地址,从Ebx中读取到传递给线程函数的参数地址。

   在DELPHI中的TThread对象的构造函数中,你可以看到这段代码

  FHandle := BeginThread(nil, 0, @ThreadProc, Pointer(Self), CREATE_SUSPENDED, FThreadID);

  再观察BeginThread的实现,你会发现TThread的调用CreateThread时,将Pointer(Self),也就是TThread对象本身当作线程函数的参数传递过去,换言之,你在TThread的派生类中定义的变量,对于一个线程而言,将存储在这个线程单独的堆栈中,而它在堆栈的地址存储在线程的上下文结构中。

   可以做一个简单的试验,将一个线程生成多次,你可以发现存储在线程对象内部的变量将互不影响。

   说到这里,必须谈论一个问题,效率的问题,我在一本书上曾经看到过这样一段话“由于访问线程对象中的数据比访问线程局部变量要快10倍,因此,你应当尽可能地把线程专用的信息保存在线程对象中。”对此,我一直没有特别理解。如果一定要相信这句话,那我会这么理解,就是存储在线程对象中的变量因为上下文结构记录了它的地址等原因,所以它更快。尽信书不如无书,我还在思考,不过好在这种速度的影响对于通常的使用而言影响不大。

  3、在DELPHI中,用Object Pascal的关键字threadvar来声明变量,以利用操作系统级的线程局部存储。

   在前面我们了解到:虽然对于局部变量,在每个线程中都一个副本,然而应用程序的全局变量是被所有线程所共享的。当多个线程对这个全局变量进行访问时,将可能出现很多未知的问题,Win32提供了一种称为线程局部存储的方式,它能使你在第一个运行的线程中创建一个全局变量的拷贝。Delphi利用关键字threadvar封装此功能。在threadvar关键字下你可以声明任何局部存储的变量。

  4、全局变量,多线程最让人头疼的地方就是全局变量了,好的同步方式将决定你高效、安全的访问全局变量,虽然上述的threadvar是解决全局变量线程局部存储的一个办法,但在我实际的编码工作中,几乎很少用它,它的局限性太多。多线程访问全局变量的方法将在下一文中详细描述。

  注:转载请著名出处,谢谢!
 
 
线程中的变量 由于每个线程都代表了一个不同的执行路径,因此,最好有一种只限于一个线程内部使用的数据, 要实现上述目的有以下几种方式: 1、局部变量(基于栈),很简单,在你的线程函数中你定义的变量既是如此。由于每个线程都在各自的栈中,各个线程将都有一套局部变量的副本,这样,就不会相互影响。对于那些只在过程或函数的生存期有意义的变量,应当把它们声明为局部变量。 2、存储在线程对象中。还记得CreateThread函数中的lpParameter参数吗,它可以接受一个无类型的指针。结合本文第一章的内容,你应该还记得,它被存储在线程内核对象的上下文结构中,你可以通过CONTEXT结构中的CONTEXT_INTEGER部分的ebx来读取它的地址。 下面是一段示例代码,用来演示读取CONTEXT结构,这段代码一般用不到,但它可以说明CrateThread函数中的lpParameter被存储的位置 [url=http://www.wangchao.net.cn/bbsdetail_566836.html][img]http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedBlockStart.gif[/img][/url][url=http://www.wangchao.net.cn/bbsdetail_566836.html][img]http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ContractedBlock.gif[/img][/url]...{ [url=http://www.wangchao.net.cn/bbsdetail_566836.html][img]http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif[/img][/url] 作者:wudi_1982 [url=http://www.wangchao.net.cn/bbsdetail_566836.html][img]http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif[/img][/url] 联系方式:wudi_1982@hotmail.com [url=http://www.wangchao.net.cn/bbsdetail_566836.html][img]http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif[/img][/url] 转载请著名出处,本代码为演示代码,只贴出了一些关键部分 [url=http://www.wangchao.net.cn/bbsdetail_566836.html][img]http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedBlockEnd.gif[/img][/url]} [url=http://www.wangchao.net.cn/bbsdetail_566836.html][img]http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif[/img][/url] [url=http://www.wangchao.net.cn/bbsdetail_566836.html][img]http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif[/img][/url]type [url=http://www.wangchao.net.cn/bbsdetail_566836.html][img]http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif[/img][/url] //传递给线程函数的结构和指针的声明 [url=http://www.wangchao.net.cn/bbsdetail_566836.html][img]http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif[/img][/url] Tinfo = record [url=http://www.wangchao.net.cn/bbsdetail_566836.html][img]http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif[/img][/url] count : integer; [url=http://www.wangchao.net.cn/bbsdetail_566836.html][img]http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif[/img][/url] x : integer; [url=http://www.wangchao.net.cn/bbsdetail_566836.html][img]http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif[/img][/url] y : integer; [url=http://www.wangchao.net.cn/bbsdetail_566836.html][img]http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif[/img][/url] end; [url=http://www.wangchao.net.cn/bbsdetail_566836.html][img]http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif[/img][/url] Pinfo= ^Tinfo; [url=http://www.wangchao.net.cn/bbsdetail_566836.html][img]http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif[/img][/url] [url=http://www.wangchao.net.cn/bbsdetail_566836.html][img]http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif[/img][/url]var [url=http://www.wangchao.net.cn/bbsdetail_566836.html][img]http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif[/img][/url]MyThreadHad : THandle;//一个全局变量,用来保存线程的句柄 [url=http://www.wangchao.net.cn/bbsdetail_566836.html][img]http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif[/img][/url] [url=http://www.wangchao.net.cn/bbsdetail_566836.html][img]http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif[/img][/url]//线程函数 [url=http://www.wangchao.net.cn/bbsdetail_566836.html][img]http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif[/img][/url]function MyThread(info : Pointer):DWORD; stdcall; [url=http://www.wangchao.net.cn/bbsdetail_566836.html][img]http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif[/img][/url]var [url=http://www.wangchao.net.cn/bbsdetail_566836.html][img]http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif[/img][/url] i : integer; [url=http://www.wangchao.net.cn/bbsdetail_566836.html][img]http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif[/img][/url]begin [url=http://www.wangchao.net.cn/bbsdetail_566836.html][img]http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif[/img][/url] //根据传递来信息决定在窗口的那个位置输出什么信息 [url=http://www.wangchao.net.cn/bbsdetail_566836.html][img]http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif[/img][/url] for i := 0 to Pinfo(info)^.count-1 do [url=http://www.wangchao.net.cn/bbsdetail_566836.html][img]http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif[/img][/url] Form1.Image1.Canvas.TextOut(Pinfo(info)^.x,Pinfo(info)^.y,inttostr(i)); [url=http://www.wangchao.net.cn/bbsdetail_566836.html][img]http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif[/img][/url] //FreeMem(info); [url=http://www.wangchao.net.cn/bbsdetail_566836.html][img]http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif[/img][/url] Result := 0; [url=http://www.wangchao.net.cn/bbsdetail_566836.html][img]http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif[/img][/url]end; [url=http://www.wangchao.net.cn/bbsdetail_566836.html][img]http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif[/img][/url] [url=http://www.wangchao.net.cn/bbsdetail_566836.html][img]http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif[/img][/url]//创建一个线程 [url=http://www.wangchao.net.cn/bbsdetail_566836.html][img]http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif[/img][/url]procedure TForm1.Button4Click(Sender: TObject); [url=http://www.wangchao.net.cn/bbsdetail_566836.html][img]http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif[/img][/url]var [url=http://www.wangchao.net.cn/bbsdetail_566836.html][img]http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif[/img][/url] ppi : Pinfo; [url=http://www.wangchao.net.cn/bbsdetail_566836.html][img]http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif[/img][/url] MyThreadId : DWORD; [url=http://www.wangchao.net.cn/bbsdetail_566836.html][img]http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif[/img][/url]begin [url=http://www.wangchao.net.cn/bbsdetail_566836.html][img]http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif[/img][/url] //分配空间并赋初值 [url=http://www.wangchao.net.cn/bbsdetail_566836.html][img]http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif[/img][/url] ppi :=AllocMem(sizeof(tinfo)); [url=http://www.wangchao.net.cn/bbsdetail_566836.html][img]http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif[/img][/url] ppi^.count := 1000000; [url=http://www.wangchao.net.cn/bbsdetail_566836.html][img]http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif[/img][/url] ppi^.x := 10; [url=http://www.wangchao.net.cn/bbsdetail_566836.html][img]http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif[/img][/url] ppi^.y := 10; [url=http://www.wangchao.net.cn/bbsdetail_566836.html][img]http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif[/img][/url] //创建 [url=http://www.wangchao.net.cn/bbsdetail_566836.html][img]http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif[/img][/url] MyThreadHad := CreateThread(nil,0,@MyThread,ppi,CREATE_SUSPENDED,MyThreadId); [url=http://www.wangchao.net.cn/bbsdetail_566836.html][img]http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif[/img][/url] //在窗体上显示线程函数的地址和传递给它的参数的地址 [url=http://www.wangchao.net.cn/bbsdetail_566836.html][img]http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif[/img][/url] labThreadAddr.Caption := inttostr( integer(@MyThread)); [url=http://www.wangchao.net.cn/bbsdetail_566836.html][img]http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif[/img][/url] labThreadPvparam.Caption := inttostr(integer(ppi)); [url=http://www.wangchao.net.cn/bbsdetail_566836.html][img]http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif[/img][/url]end; [url=http://www.wangchao.net.cn/bbsdetail_566836.html][img]http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif[/img][/url] [url=http://www.wangchao.net.cn/bbsdetail_566836.html][img]http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif[/img][/url]//读取CONTEXT结构,注意CONTEXT结构是和CPU有关的,我这里测试时,工作在intel的CPU上 [url=http://www.wangchao.net.cn/bbsdetail_566836.html][img]http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif[/img][/url]procedure TForm1.btnRContextClick(Sender: TObject); [url=http://www.wangchao.net.cn/bbsdetail_566836.html][img]http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif[/img][/url]var [url=http://www.wangchao.net.cn/bbsdetail_566836.html][img]http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif[/img][/url] con : _CONTEXT; [url=http://www.wangchao.net.cn/bbsdetail_566836.html][img]http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif[/img][/url]begin [url=http://www.wangchao.net.cn/bbsdetail_566836.html][img]http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif[/img][/url] //初始化结构 [url=http://www.wangchao.net.cn/bbsdetail_566836.html][img]http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif[/img][/url] con.ContextFlags := CONTEXT_FULL; [url=http://www.wangchao.net.cn/bbsdetail_566836.html][img]http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif[/img][/url] //读取 [url=http://www.wangchao.net.cn/bbsdetail_566836.html][img]http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif[/img][/url] GetThreadContext(MyThreadHad,con); [url=http://www.wangchao.net.cn/bbsdetail_566836.html][img]http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif[/img][/url] //显示在窗体的listbox上 [url=http://www.wangchao.net.cn/bbsdetail_566836.html][img]http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif[/img][/url] with lbxContextInfo.Items do [url=http://www.wangchao.net.cn/bbsdetail_566836.html][img]http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif[/img][/url] begin [url=http://www.wangchao.net.cn/bbsdetail_566836.html][img]http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif[/img][/url] // Clear; [url=http://www.wangchao.net.cn/bbsdetail_566836.html][img]http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif[/img][/url] Add('------------CONTEXT--------------'); [url=http://www.wangchao.net.cn/bbsdetail_566836.html][img]http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif[/img][/url] Add(''); [url=http://www.wangchao.net.cn/bbsdetail_566836.html][img]http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif[/img][/url] Add('CONTEXT_DEBUG_REGISTERS-----'); [url=http://www.wangchao.net.cn/bbsdetail_566836.html][img]http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif[/img][/url] Add('dr0:'+#9+IntToStr(con.Dr0)); [url=http://www.wangchao.net.cn/bbsdetail_566836.html][img]http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif[/img][/url] Add('dr1:'+#9+IntToStr(con.Dr1)); [url=http://www.wangchao.net.cn/bbsdetail_566836.html][img]http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif[/img][/url] Add('dr2:'+#9+IntToStr(con.Dr2)); [url=http://www.wangchao.net.cn/bbsdetail_566836.html][img]http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif[/img][/url] Add('dr3:'+#9+IntToStr(con.Dr3)); [url=http://www.wangchao.net.cn/bbsdetail_566836.html][img]http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif[/img][/url] Add('dr6:'+#9+IntToStr(con.Dr6)); [url=http://www.wangchao.net.cn/bbsdetail_566836.html][img]http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif[/img][/url] Add('dr7:'+#9+IntToStr(con.Dr7)); [url=http://www.wangchao.net.cn/bbsdetail_566836.html][img]http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif[/img][/url] add('CONTEXT_SEGMENTS---------'); [url=http://www.wangchao.net.cn/bbsdetail_566836.html][img]http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif[/img][/url] Add('segGs:'+#9+inttostr(con.SegGs)); [url=http://www.wangchao.net.cn/bbsdetail_566836.html][img]http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif[/img][/url] Add('segFs:'+#9+inttostr(con.Segfs)); [url=http://www.wangchao.net.cn/bbsdetail_566836.html][img]http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif[/img][/url] Add('segEs:'+#9+inttostr(con.Seges)); [url=http://www.wangchao.net.cn/bbsdetail_566836.html][img]http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif[/img][/url] Add('segDs:'+#9+inttostr(con.Segds)); [url=http://www.wangchao.net.cn/bbsdetail_566836.html][img]http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif[/img][/url] Add('CONTEXT_INTEGER.---------'); [url=http://www.wangchao.net.cn/bbsdetail_566836.html][img]http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif[/img][/url] Add('edi: '+#9+IntToStr(con.Edi)); [url=http://www.wangchao.net.cn/bbsdetail_566836.html][img]http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif[/img][/url] Add('esi: '+#9+IntToStr(con.Esi)); [url=http://www.wangchao.net.cn/bbsdetail_566836.html][img]http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif[/img][/url] Add('ebx: '+#9+IntToStr(con.Ebx)); [url=http://www.wangchao.net.cn/bbsdetail_566836.html][img]http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif[/img][/url] Add('edx: '+#9+IntToStr(con.Edx)); [url=http://www.wangchao.net.cn/bbsdetail_566836.html][img]http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif[/img][/url] Add('ecx: '+#9+IntToStr(con.Ecx)); [url=http://www.wangchao.net.cn/bbsdetail_566836.html][img]http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif[/img][/url] Add('eax: '+#9+IntToStr(con.Eax)); [url=http://www.wangchao.net.cn/bbsdetail_566836.html][img]http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif[/img][/url] Add('CONTEXT_CONTROL----------'); [url=http://www.wangchao.net.cn/bbsdetail_566836.html][img]http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif[/img][/url] Add('Ebp: '+#9+IntToStr(con.Ebp)); [url=http://www.wangchao.net.cn/bbsdetail_566836.html][img]http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif[/img][/url] Add('Eip: '+#9+IntToStr(con.Eip)); [url=http://www.wangchao.net.cn/bbsdetail_566836.html][img]http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif[/img][/url] Add('segcs: '+#9+IntToStr(con.SegCs)); [url=http://www.wangchao.net.cn/bbsdetail_566836.html][img]http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif[/img][/url] Add('EFlags: '+#9+IntToStr(con.EFlags)); [url=http://www.wangchao.net.cn/bbsdetail_566836.html][img]http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif[/img][/url] Add('Esp: '+#9+IntToStr(con.Esp)); [url=http://www.wangchao.net.cn/bbsdetail_566836.html][img]http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif[/img][/url] Add('SegSs: '+#9+IntToStr(con.SegSs)); [url=http://www.wangchao.net.cn/bbsdetail_566836.html][img]http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif[/img][/url] end; [url=http://www.wangchao.net.cn/bbsdetail_566836.html][img]http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif[/img][/url] [url=http://www.wangchao.net.cn/bbsdetail_566836.html][img]http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif[/img][/url]end; [url=http://www.wangchao.net.cn/bbsdetail_566836.html][img]http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif[/img][/url] [url=http://www.wangchao.net.cn/bbsdetail_566836.html][img]http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif[/img][/url] 把上面代码整理之后,添加到你的程序中,你可以发现(如果也是intel的CPU),那么你可以从Eax寄存器读取到线程函数的地址,从Ebx中读取到传递给线程函数的参数地址。 在DELPHI中的TThread对象的构造函数中,你可以看到这段代码 FHandle := BeginThread(nil, 0, @ThreadProc, Pointer(Self), CREATE_SUSPENDED, FThreadID); 再观察BeginThread的实现,你会发现TThread的调用CreateThread时,将Pointer(Self),也就是TThread对象本身当作线程函数的参数传递过去,换言之,你在TThread的派生类中定义的变量,对于一个线程而言,将存储在这个线程单独的堆栈中,而它在堆栈的地址存储在线程的上下文结构中。 可以做一个简单的试验,将一个线程生成多次,你可以发现存储在线程对象内部的变量将互不影响。 说到这里,必须谈论一个问题,效率的问题,我在一本书上曾经看到过这样一段话“由于访问线程对象中的数据比访问线程局部变量要快10倍,因此,你应当尽可能地把线程专用的信息保存在线程对象中。”对此,我一直没有特别理解。如果一定要相信这句话,那我会这么理解,就是存储在线程对象中的变量因为上下文结构记录了它的地址等原因,所以它更快。尽信书不如无书,我还在思考,不过好在这种速度的影响对于通常的使用而言影响不大。 3、在DELPHI中,用Object Pascal的关键字threadvar来声明变量,以利用操作系统级的线程局部存储。 在前面我们了解到:虽然对于局部变量,在每个线程中都一个副本,然而应用程序的全局变量是被所有线程所共享的。当多个线程对这个全局变量进行访问时,将可能出现很多未知的问题,Win32提供了一种称为线程局部存储的方式,它能使你在第一个运行的线程中创建一个全局变量的拷贝。Delphi利用关键字threadvar封装此功能。在threadvar关键字下你可以声明任何局部存储的变量。 4、全局变量,多线程最让人头疼的地方就是全局变量了,好的同步方式将决定你高效、安全的访问全局变量,虽然上述的threadvar是解决全局变量线程局部存储的一个办法,但在我实际的编码工作中,几乎很少用它,它的局限性太多。多线程访问全局变量的方法将在下一文中详细描述。 注:转载请著名出处,谢谢!
󰈣󰈤
日版宠物情人插曲《Winding Road》歌词

日版宠物情人2017的插曲,很带节奏感,日语的,女生唱的。 最后听见是在第8集的时候女主手割伤了,然后男主用嘴帮她吸了一下,插曲就出来了。 歌手:Def...

兄弟共妻,我成了他们夜里的美食

老钟家的两个儿子很特别,就是跟其他的人不太一样,魔一般的执着。兄弟俩都到了要结婚的年龄了,不管自家老爹怎么磨破嘴皮子,兄弟俩说不娶就不娶,老父母为兄弟两操碎了心...

网络安全治理:国家安全保障的主要方向是打击犯罪,而不是处置和惩罚受害者

来源:中国青年报 新的攻击方法不断涌现,黑客几乎永远占据网络攻击的上风,我们不可能通过技术手段杜绝网络攻击。国家安全保障的主要方向是打击犯罪,而不是处置和惩罚...

 
 
 
>>返回首页<<
 为你推荐
 
 
 
 转载本文
 UBB代码 HTML代码
复制到剪贴板...
 
 
 热帖排行
 
单纯美女 迷人女孩
校园甜美少女
忍辱负重
大学校园
 
 
王朝网络微信公众号
微信扫码关注本站公众号wangchaonetcn
 
  免责声明:本文仅代表作者个人观点,与王朝网络无关。王朝网络登载此文出于传递更多信息之目的,并不意味着赞同其观点或证实其描述,其原创性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
 
 
©2005- 王朝网络 版权所有