导航

心动吧DELPHI网络书

自发研究:须要多维思想而且要想不可能为可能的人才能做到

[置顶] {下载}本站提供delphi下载

  下载的时候最好不要用迅雷,要不然很容易断线.

  提供多个控件下载:

delphi判断线程是否正在运行

以下资料来自大富翁论坛。
判断线程是否释放
返回值:0-已释放;1-正在运行;2-已终止但未释放;3-未建立或不存在

function TFrmMain.CheckThreadFreed(aThread: TThread): Byte;
var
 i: DWord;
 IsQuit: Boolean;
begin
 if Assigned(aThread) then

.....

多线程: 不使用同步工具, 手动协调线程依次执行

在前面例子的基础上, 探讨新问题.



假如我们想让几个线程(例子中是 3 个)依次执行, 我们可以使用临界区、信号、互斥等手段;

但下面第一个例子什么同步工具都没用, 也达到了目的; 方法是: 让前一个线程在结束前顺便启动下一个线程.



第二个例子使用了互斥对象配合 WaitForSingleObject 函数, 也达到相似的目的.

效果图(两个例子的效果图差不多, 但第二个例子的执行顺序不好保证):

....

多线程同步之 WaitableTimer (等待定时器对象)-多类型理解

喝酒醉了一天, 重装系统一天, 两天没上博客了; 继续学习...



想过没有? WaitableTimer 是在 "定时等待", 前面例子中的 WaitForSingleObject 等待函数 "也在等待", 这就 "双重等待" 了, 这不好, 太浪费资源.



其实作为同步工具, 前面的几种方法(事件、信号、临界区)基本够用了; WaitableTimer 的作用并不是为了重复前面的功能, 它的主要功用类似 TTimer 类; 譬如每隔多长时间执行一段代码、或在指定的时间去执行一段代码.



既然有了方便的 TTimer, 何必再使用 WaitableTimer 呢?

因为 WaitableTimer 比 TTimer 精确的多, 它的间隔时间可以精确到毫秒、它的指定时间甚至是精确到 0.1 毫秒;

而 TTimer 驱动的 WM_TIMER 消息, 是消息队列中优先级最低的, 也就是再同一时刻 WM_TIMER 消息总是被最后处理.

还有重要的一点 WaitableTimer 可以跨线程、跨进程使用.



继续探讨一个重要的点: 很多时候为了让线程不冲突, 线程也在等待, 既然有等待, 那 WaitableTimer 非常精确的定时又有什么价值呢? 对这个问题的思考, 可.........

WaitForSingleObject大致理解

明生KISS提示:这是一个等待函数,当未激活的状态下他是休眠的。。处理大量数值的时候他是一个属于优化类型的函数(至少我这么认为)..

有一样我想得不太明白的~这一个互斥的对像的意思是不是其余四条线程在等待。





详细的是:你的程序创建了五条线程。

当五个线程都调用了MyThreadFun的时候他们会执行到(if WaitForSingleObject(hMutex, INFINITE) = WAIT_OBJECT_0 then)这里的时候就会处于排队状态。。等待第一个运行完并释放了权限后才能让第二个线程进入~

...

13多线程同步之 Event (事件对象)

据说 Event(事件对象) 是多线程最原始的同步手段, 我觉得它是最灵活的一个.

Event 对象(的句柄表)中主要有两个布尔变量, 从它的建立函数中可以看得清楚:
 
function CreateEvent(
lpEventAttributes: PSecurityAttributes; {安全设置}
...

12.多线程同步之 Semaphore (信号对象)

之前已经有了两种多线程的同步方法:

CriticalSection(临界区) 和 Mutex(互斥), 这两种同步方法差不多, 只是作用域不同;

CriticalSection(临界区) 类似于只有一个蹲位的公共厕所, 只能一个个地进;

Mutex(互斥) 对象类似于接力赛中的接力棒, 某一时刻只能一个人持有, 谁拿着谁跑.



什么是 Semaphore(信号或叫信号量)呢?

譬如到银行办业务、或者到车站买票, 原来只有一个服务员, 不管有多少人排队等候, 业务只能一个个地来.

...

11多线程同步之 Mutex (互斥对象)

原理分析:

互斥对象是系统内核对象, 各线程都可以拥有它, 谁拥有谁就能执行;

执行完毕, 用 ReleaseMutex 函数释放拥有权, 以让其他等待的线程使用.

其他线程可用 WaitForSingleObject 函数排队等候(等候也可以理解为排队申请).



使用过程:

var hMutex: THandle; {应该先声明一个全局的互斥句柄}
...

GetMessage休眠后如何唤醒

while GetMessage(MsgRec, 0, 0, 0) do

begin

TranslateMessage(MsgRec);

DispatchMessage(MsgRec);

//Sleep(1000);

if abool=true then  Break;

end;



当我发送了消息队列的时候,发送完之后,线程会处于休眠状态,这时候该怎么样做才可以让线程重新唤醒或者结束他呢?



个人想法:

  在主窗中插入一个定时器,然后在定时器执行的代码中写入

  PostThreadMessage(ThreadId,WM_QUIT,0,0) //僵哥代码

  到一定的时候就执行一下上面的代码让他退出他



  而这时候的问题来了.

  PostThreadMessage当中的Threadid参数我如何获得,从上面的循环中我看中了一个msgrec我是否能够替换Treadid呢?替换成下面的

            PostThreadMessage(MsgRec,WM_QUIT,0,0)

      替换后,我发现WM_QUIT出现提示

            incompatible types: 'cardinal' and 'tagMsg'

    简单来说就是类型不一样无法替换...



问题1:我在主窗体内写这样的代码会不会有其他的问题存在?

问题2:应该怎么解决休眠问题和如何传递参数到主窗体的定时器中 

 

DELPHI 线程池代码

 

unit uThreadPool;

{ aPool.AddRequest(TMyRequest.Create(RequestParam1, RequestParam2, ...)); }

interface
uses
Windows,
Classes;

// 是否记录日志
// {$DEFINE NOLOGS}

type
TCriticalSection = class(TObject)
...

多线程的检查,与关闭线程

在delphi处理线程的时候常常会造成某些未知的bug,搞得程序无法继续往下走,所以此时我们必需要有应对手策,否则的话,很容易造成我们的工作无法完成

TThread —— 线程类详解

 

TThread是一个抽象类,可以创建几个独立的线程。
类关系 TObject
在一个多线程的应用程序中创建一个TThread的后子类代表一个线程。每一新子类的TThread对象的实例是一个新的线程。从TThread派生的多线程
实例可以构成Delphi的多线程应用程序。
  当一个应用程序运行时,应用程序就被载入内存准备执行。此时,它成为包含一个或多个线程的进程,每个线程含有数据、代码和系统资
...

Delphi多线程编程

1-1 多线程的基本概念

WIN 98/NT/2000/XP 是个多任务操作系统,也就是:一个进程可以划分为多个线程,每个线程轮流占用CPU 运行时间和资源,或者说,把CPU 时间划成片,每个片分给不同的线程,这样,每个线程轮流的“挂起”和“唤醒”,由于时间片很小,给人的感觉是同时运行的。
多线程带来如下好处:(自己阅读)
1)避免瓶颈;
2)并行操作;
3)提高效率;
...

分页:[«]1[2][»]

日历

<< 2013-5 >>

Sun

Mon

Tue

Wed

Thu

Fri

Sat

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

站内搜索

Copyright ⊙ 2004-2009 心动吧 UrL:ABCXD.CoM All RiGhts Reserved