多线程编程(15)

本次专门研究下 SetWaitableTimer 的第二个参数(起始时间).

它有正值、负值、0值三种情况, 前面已用过 0值.

先学习负值(相对时间), 也就是从当前算起隔多长时间开始执行.

这个相对时间是已 1/100 纳秒为单位的, 譬如赋值 3*10000000 相当于 3 秒.

1 s(秒) = 1,000       ms(毫秒);
1 s(秒) = 1,000,000     µs(微妙);
1 s(秒) = 1,000,000,000   ns(纳秒);
1 s(秒) = 1,000,000,000,000 ps(皮秒);

本例效果图:

代码文件:

unit Unit1;
interface
uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, StdCtrls;
type
 TForm1 = class(TForm)
  Button1: TButton;
  procedure Button1Click(Sender: TObject);
  procedure FormDestroy(Sender: TObject);
 end;
var
 Form1: TForm1;
implementation
{$R *.dfm}
var
 f: Integer;
 hWaitableTimer: THandle;
function MyThreadFun(p: Pointer): DWORD; stdcall;
var
 i,y: Integer;
begin
 Inc(f);
 y := 20 * f;
 if WaitForSingleObject(hWaitableTimer, INFINITE) = WAIT_OBJECT_0 then
 begin
  for i := 0 to 1000 do
  begin
   Form1.Canvas.Lock;
   Form1.Canvas.TextOut(20, y, IntToStr(i));
   Form1.Canvas.Unlock;
   Sleep(1);
  end;
 end;
 Result := 0;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
 ThreadID: DWORD;
 DueTime: Int64;
begin
 hWaitableTimer := CreateWaitableTimer(nil, True, nil);
 DueTime := -3*10000000; {3秒钟后执行}
 SetWaitableTimer(hWaitableTimer, DueTime, 0, nil, nil, False);
 Repaint; f := 0;
 CreateThread(nil, 0, @MyThreadFun, nil, 0, ThreadID);
 CreateThread(nil, 0, @MyThreadFun, nil, 0, ThreadID);
 CreateThread(nil, 0, @MyThreadFun, nil, 0, ThreadID);
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
 CloseHandle(hWaitableTimer);
end;
end.

窗体文件:

object Form1: TForm1
 Left = 0
 Top = 0
 Caption = 'Form1'
 ClientHeight = 116
 ClientWidth = 179
 Color = clBtnFace
 Font.Charset = DEFAULT_CHARSET
 Font.Color = clWindowText
 Font.Height = -11
 Font.Name = 'Tahoma'
 Font.Style = []
 OldCreateOrder = False
 OnDestroy = FormDestroy
 PixelsPerInch = 96
 TextHeight = 13
 object Button1: TButton
  Left = 96
  Top = 83
  Width = 75
  Height = 25
  Caption = 'Button1'
  TabOrder = 0
  OnClick = Button1Click
 end
end

时间: 2024-11-02 13:41:04

多线程编程(15)的相关文章

Visual C#中的多线程编程

visual|编程|多线程 C#是.Net平台的通用开发工具,它能够建造所有的.Net应用.在.Net中所有线程都运行在应用程序域(AppDomain)中,这也许让你想到Win32进程,实际上它们还是有很大的不同.应用程序域提供了一种安全而通用的处理单元,公共语言运行库可使用它来隔离应用程序.注意在.Net中应用程序的隔离是应用程序域而不是进程,在单个进程中可以存在几个应用程序域,而且线程可以跨越应用程序域的范围,某个线程中的方法可以调用另一个线程的方法,这样的话就不会造成进程间调用或进程间切换

PHP多线程编程之管道通信实例分析

 这篇文章主要介绍了PHP多线程编程之管道通信,实例分析了管道通信的原理与相关使用技巧,具有一定参考借鉴价值,需要的朋友可以参考下     本文实例讲述了PHP多线程编程之管道通信用法.分享给大家供大家参考.具体分析如下: 一个线程如果是个人英雄主义,那么多线程就是集体主义,你不再是一个独行侠,而是一个指挥家. 管道通信: 1. 管道可以认为是一个队列,不同的线程都可以往里面写东西,也都可以从里面读东西.写就是 在队列末尾添加,读就是在队头删除. 2. 管道一般有大小,默认一般是4K,也就是内容

Ruby多线程编程初步入门

  这篇文章主要介绍了Ruby多线程编程初步入门,线程是Ruby编程学习当中的重点和难点,需要的朋友可以参考下 传统程序有一个单独的线程执行,包含该程序的语句或指令顺序执行直到程序终止. 一个多线程的程序有多个线程的执行.在每个线程是按顺序执行的,但是在多核CPU机器上线程可能并行地执行.例如,通常情况下在单一CPU的机器,多个线程实际上不是并行执行的,而是模拟并行交叉的线程的执行. Ruby的可以使用 Thread 类很容易地编写多线程程序. Ruby线程是一个轻量级的和高效的在代码中实现并行

在Python下尝试多线程编程

  这篇文章主要介绍了在Python下多线程编程的尝试,由于GIL的存在,多线程在Python开发领域一直是个热门问题,需要的朋友可以参考下 多任务可以由多进程完成,也可以由一个进程内的多线程完成. 我们前面提到了进程是由若干线程组成的,一个进程至少有一个线程. 由于线程是操作系统直接支持的执行单元,因此,高级语言通常都内置多线程的支持,Python也不例外,并且,Python的线程是真正的Posix Thread,而不是模拟出来的线程. Python的标准库提供了两个模块:thread和thr

iOS多线程编程之三——GCD的应用

iOS多线程编程之三--GCD的应用 一.引言 在软件开发中使用多线程可以大大的提升用户体验度,增加工作效率.iOS系统中提供了多种分线程编程的方法,在前两篇博客都有提及: NSThread类进行多线程编程:http://my.oschina.net/u/2340880/blog/416524. NSOperation进行多线程操作编程:http://my.oschina.net/u/2340880/blog/416782. 上两个进行多线程编程的机制都是封装于Object-C的类与方法.这篇博

iOS多线程编程之二——NSOperation与NSOperationQueue

iOS多线程编程之二--NSOperation与NSOperationQueue 一.NSOperation解析 NSOperation是基于Object-C封装的一套管理与执行线程操作的类.这个类是一个抽象类,通常情况下,我们会使用NSInvocationOperation和NSBlockOperation这两个子类进行多线程的开发,当然我们也可以写继承于NSOperation的类,封装我们自己的操作类. 1.NSOperation抽象类中提供的逻辑方法 操作开始执行 ? 1 - (void)

关于多线程编程您不知道的 5 件事 有关高性能线程处理的微妙之处

虽然很少有 Java 开发人员能够忽视多线程编程和支持它的 Java 平台库,更少有人有时间深入研究线程.相反地,我们临时学习线程,在需要时向我们的工具箱添加新的技巧和技术.以这种方式构建和运行适当的应用程序是可行的,但是您可以做的不止这些.理解 Java 编译器的线程处理特性和 JVM 将有助于您编写更高效.性能更好的 Java 代码. 在这期的 5 件事 系列 中,我将通过同步方法.volatile 变量和原子类介绍多线程编程的一些更隐晦的方面.我的讨论特别关注于这些构建如何与 JVM 和

C语言多线程编程

原文:C语言多线程编程 注:本文内容来源于互联网,感谢作者整理! Windows的多线程编程 c语言 在Windows的多线程编程中,创建线程的函数主要有CreateThread和_beginthread(及_beginthreadex). CreateThread 和 ExitThread    使用API函数CreateThread创建线程时,其中的线程函数原型:  DWORD WINAPI ThreadProc(LPVOID lpParameter);在线程函数返回后,其返回值用作调用Ex

IOS多线程编程的3种实现方法_IOS

前言 在多线程简介中,我已经说明过了,为了提高界面的流畅度以及用户体验.我们务必要把耗时的操作放到别的线程中去执行,千万不要阻塞主线程. iOS中有以下3种多线程编程方法: NSThread Grand Centeral Dispatch(GCD) NSOperation和NSOperationQueue 1.NSThread 这是最轻量级的多线程的方法,使用起来最直观的多线程编程方法.但是因为需要自己管理线程的生命周期,线程同步.经常使用NSThread进行调试,在实际项目中不推荐使用. //