文章分类 - Delphi TThread
Delphi 多线程
摘要:当一个线程在使用时,如果这个函数使用了Synchronize修钸的话就不允许别一个线程来调用这个函数,它的目的是避免多个子线程同时访问主线程资源。示例:procedure ServerThread.ListItemEnd; //子线程的一个方法beginif (ListItem <> nil) th
阅读全文
摘要:之前学习了用API实现,让我们再学习下用DELPHI的TThread类。 先新建一个普通的工程,再新建一个线程类File>>New>>Othre>>Delphi File>Thread Object,取个名字,DELPHI会自动生成一个单元,我们只需往里简单添加功能代码,和在要使用的单元里实例引用即
阅读全文
摘要:当一个线程在使用时,如果这个函数使用了Synchronize修钸的话就不允许别一个线程来调用这个函数,它的目的是避免多个子线程同时访问主线程资源。示例:procedure ServerThread.ListItemEnd; //子线程的一个方法beginif (ListItem nil) thenListItem.SubItems.Strings[3] := '传送完毕'; //ListItem是主线程的一个TreeView的一行end;procedure ServerThread.ClientExecute; //子线程执行beginSynchronize(ListItemE
阅读全文
摘要://这篇文章有很多的知识点。在网上我们也可以找到相关例子,不过用的是Delphi的TThread类,我个人不太爱用,一个线程也弄的那么麻烦,不过各有各的好处,这里就不谈论Delphi的TThread类了,我们以在线程里运行MessageBoxA显示一对话框为例(也就是线程MessageBoxA)。我们先看看CreateThread的函数定义:function CreateThread(lpThreadAttributes: Pointer; dwStackSize: DWORD; lpStartAddress: TFNThreadStartRoutine; lpParameter: Point
阅读全文
摘要:参数类型:_ParamTOHandleStreamMsgThread=recordaddr:TAddress;PInfo:Pointer;size:integer;end;启动线程的代码:varparam:_ParamTOHandleStreamMsgThreadbegin.............................param.addr:=addr;param.PInfo:=pInfo;param.size:=i;threadhandle1:=CreateThread(nil,0,@HandleSTREAMMSGThread,@param,0,threadid1);CloseHa
阅读全文
摘要:function CreateThread(lpThreadAttributes: Pointer; dwStackSize: DWORD; lpStartAddress: TFNThreadStartRoutine; lpParameter: Pointer; dwCreationFlags: DWORD; var lpThreadId: DWORD): THandle; stdcall;其中lpStartAddress,lpParameter,lpThreadId三个参数是必须的。lpStartAddress参数指向的是线程执行体ThreadProc的开始地址;lpParameter指..
阅读全文
摘要:问:在VC中hThread=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)MyThreadFouc,&gvar,0,&ThreadId);CreateThread之后,线程开始执行,MyThreadFouc函数执行完后,线程是什么状态,终止还是继续在运行如果没有终止了,如何再让线程继续运行这个函数加个条件语句whilefor这样的方法让函数继续运行就不要说了,我想知道如何让线程再继续运行下去答:线程函数只要返回,线程就结束了吧。线程也只是完成一定的功能而已,完成了自然就该结束掉。对于重复性的工作,那就循环了转自:http://bbs.c
阅读全文
摘要:线程的handle用处:线程的handle是指向“线程的内核对象”的,而不是指向线程本身.每个内核对象只是内核分配的一个内存块,并且只能由内核访问。该内存块是一种数据结构,它的成员负责维护对象的各种信息(eg: 安全性描述,引用计数等)。CloseHandle()在CreateThread成功之后会返回一个hThread的handle,且内核对象的计数加1,CloseHandle之后,引用计数减1,当变为0时,系统删除内核对象。但是这个handle并不能完全代表这个线程,它仅仅是线程的一个“标识”,系统和用户可以利用它对相应的线程进行必要的操纵。如果在线程成功创建后,不再需要用到这个句柄,就可
阅读全文
摘要://文章太长了,只摘了点关键。这是C++的写法。Delphi写法如下:wb1Stream := nil; //这个才是关键;否则出错!CoMarshalInterThreadInterfaceInStream(IID_IHTMLDocument3,spDoc,IStream(wb1Stream));/*--------------------------------------------------------------------*/现在服务可以正常在多线程中发送事件了。在发送事件函数中值的注意的是这几句。为什么要重新封装。之前不是已经封装好了吗?因为CoMarshalInterThre
阅读全文
摘要:今天重新学习多线程,发生了很多问题,按照这个时间,我应该是在睡午觉的时候了。-_-~!跨线程操作Com 或者叫 Delphi 多线程 WebBrowser出错,又可以叫作 Delphi 多线程 IhtmlDocument2 赋值出错、多线程操作网页元素提示错误,百度一下还有很多这类的问题,其它统称“跨线程操作com”。我写这么多,是为了给像我这样的新手找到这篇文章,更快地掌握它。编程遇到问题的时候真的很无助,没有人教程你,只能自己百度来百度去,不断的累积知识,推敲。转载一章文章:http://www.cnblogs.com/MaxWoods/archive/2006/08/07/469970.
阅读全文
摘要:摘 要 使用动态连接库(DLL)可以将资源、函数、过程等封装,同样也可以将系统需要调用的子窗体封装起来,在需要时调用。不仅能够节省系统资源,同时也有利于整个软件的模块化处理。Delphi是Windows操作系统中流行的快速开发工具,可以方便的创建和调用动态连接库。本文中,介绍了使用Delphi来完成在动态连接库中封装及调用子窗体的完整过程。关键词 封装 动态连接库 子窗体 Delphi在Windows的应用程序中,MDI类型的应用程序非常普遍,对于子窗体的调用,则是各有其法。在Windows操作系统中,大量使用到了DLL(动态连接库),通过这种方式可以将程序设计模块化,在系统更新时较为方便。1
阅读全文
摘要:一下子跳到等待函数 WaitForSingleObject, 是因为下面的 Mutex、Semaphore、Event、WaitableTimer 等同步手段都要使用这个函数; 不过等待函数可不止 WaitForSingleObject 它一个, 但它最简单.function WaitForSingleObject( hHandle: THandle; {要等待的对象句柄} dwMilliseconds: DWORD {等待的时间, 单位是毫秒}): DWORD; stdcall; {返回值如下:}WAIT_OBJECT_0 {等着了, 本例中是: 等的那个进程终于结束了}WAIT_...
阅读全文
摘要:终止线程有两个函数:ExitThread 和 TerminateThread居说这样退出线程不好,最佳的方法就是认线程函数执行完成后返回。例如:GatherFun函数体执行完成以后,线程就退出了。function GatherFun:Cardinal;stdcall;begin Form1.GatherAddr;end;GatherHwnd := CreateThread(nil,0,@GatherFun,nil,0,Temp);问:怎么知道线程是否退出呢?答:执行 if WaitForSingleObject(Thread.Handle, INFINITE) = WAIT_OBJEC...
阅读全文
摘要:线程是进程内一个相对独立的、可调度的执行单元。一个应用可以有一个主线程,一个主线程可以有多个子线程,子线程还可以有自己的子线程,这样就构成了多线程应用了。由于多个线程往往会同时访问同一块内存区域,频繁的访问这块区域,将会增加产生线程冲突的概率。一旦产生了冲突,将会造成不可预料的结果(该公用区域的值是不可预料的)可见处理线程同步的必要性。 注意:本文中出现的所有代码都是用DELPHI描述的,调试环境为Windows me ,Delphi 6。其中所涉及的Windows API函数可以从MSDN获得详细的文档。 首先引用一个实例来引出我们以下的讨论,该实例没有采取任何措施来避免线程冲突,它...
阅读全文
摘要:建立匿名线程 CreateAnonymousThread 居然还有这个函数。转自:http://www.cnblogs.com/del/archive/2011/05/18/2049913.html//更详尽。这些只是部分代码:procedure MyMethod;var i: Integer;begin for i := 0 to 500000 do begin Form1.Canvas.Lock; Form1.Canvas.TextOut(10, 10, IntToStr(i)); Form1.Canvas.Unlock; end;end;procedure TForm1.Butto...
阅读全文
摘要:本文的内容取自网络,并重新加以整理,在此留存仅仅是方便自己学习和查阅。所有代码均亲自测试 delphi7下测试有效。图片均为自己制作。多线程应该是编程工作者的基础技能, 但这个基础我从来没学过,所以仅仅是看上去会一些,明白了2+2的时候,其实我还不知道1+1。开始本应该是一篇洋洋洒洒的文字, 不过我还是提倡先做起来, 在尝试中去理解.先试试这个:procedureTForm1.Button1Click(Sender:TObject);vari:Integer;beginfori:=0to500000dobeginCanvas.TextOut(10,10,IntToStr(i));end;end
阅读全文