delphi 字符串函数_C语言字符串函数

delphi 字符串函数_C语言字符串函数QueueUserWorkItem函数Windows说明如下:一、异步调用函数:BOOLQueueUserWorkItem(PTHREAD_START_ROUTINEpfnCallback,PVOIDpvContext,ULONGdwFlags);该函数将“工作项目”放入线程池并且立即返回。工作项目是指一个用pfnCallback参数标识的函数。它被调用并且传递…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

 QueueUserWorkItem 函数 Windows 说明如下:

 

一、异步调用函数:
BOOL QueueUserWorkItem(
PTHREAD_START_ROUTINE pfnCallback,
PVOID pvContext,
ULONG dwFlags);
该函数将“工作项目”放入线程池并且立即返回。工作项目是指一个用pfnCallback参数标识的函数。它被调用并且传递单个参数pvContext.工作项目函数原型如下:
DWORD WINAPI WorkItemFunc(PVOID pvContext);
dwFlags参数:WT_EXECUTEDEFAULT  工作项目放入非I/O组件得线程中
             WT_EXECUTEINIOTHREAD 工作项目放入I/O组件的线程中,这样的线程在I/O请求没有完成之前不会被终止运行                                  ,防止因为线程被终止导致I/O请求丢失。
             WT_EXECUTEINPERSISTENTTHREAD 放入永久线程池,
             WT_EXECUTELONGFUNCTION  工作项目需要长时间的工作,系统会据此安排更多的线程。

线程池不能设置线程个数的上限,否则排队个数超过线程个数上限的时候,会导致所有的线程都被中断。

工作项目函数如果访问了已经被卸载的DLL,会产生违规访问。

 

delphi 官网给出的调用例子:

unit ThreadPoolUnit;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ExtCtrls;

type
  TForm3
= class(TForm)
    PaintBox1: TPaintBox;
    Button1: TButton;
    ListBox1: TListBox;
   
procedure Button1Click(Sender: TObject);
  private
   
type
      TWorkerColor
= class
        FThreadID: Integer;
        FColor: TColor;
        FForm: TForm3;
       
procedure PaintLines(Sender: TObject);
       
procedure PaintLine;
        constructor Create(AForm: TForm3; AColor: TColor);
     
end;
   
var
      FIndex: Integer;
  public
   
{
Public declarations }
 
end;

  TObjectHelper = class helper for TObject

  end;

  TThreadPool = class
  private
   
type
      TUserWorkItem
= class
        FSender: TObject;
        FWorkerEvent: TNotifyEvent;
     
end;
    class
procedure QueueWorkItem(Sender: TObject; WorkerEvent: TNotifyEvent; Flags: ULONG); overload; static;
  public
    class
procedure QueueWorkItem(Sender: TObject; WorkerEvent: TNotifyEvent); overload; static;
    class
procedure QueueIOWorkItem(Sender: TObject; WorkerEvent: TNotifyEvent); static;
    class
procedure QueueUIWorkItem(Sender: TObject; WorkerEvent: TNotifyEvent); static;
 
end;

var
  Form3: TForm3;
  ThreadPool: TThreadPool;

implementation

{
$R *.dfm}

const
  WT_EXECUTEDEFAULT      
= ULONG($00000000);
  WT_EXECUTEINIOTHREAD   
= ULONG($00000001);
  WT_EXECUTEINUITHREAD   
= ULONG($00000002);
  WT_EXECUTEINWAITTHREAD 
= ULONG($00000004);
  WT_EXECUTEONLYONCE     
= ULONG($00000008);
  WT_EXECUTEINTIMERTHREAD
= ULONG($00000020);
  WT_EXECUTELONGFUNCTION 
= ULONG($00000010);
  WT_EXECUTEINPERSISTENTIOTHREAD 
= ULONG($00000040);
  WT_EXECUTEINPERSISTENTTHREAD
= ULONG($00000080);
  WT_TRANSFER_IMPERSONATION
= ULONG($00000100);

function QueueUserWorkItem (func: TThreadStartRoutine; Context: Pointer; Flags: ULONG): BOOL; stdcall; external kernel32 name QueueUserWorkItem;

function InternalThreadFunction(lpThreadParameter: Pointer): Integer; stdcall;
begin
  Result :
= 0;
  try
    try
     
with TThreadPool.TUserWorkItem(lpThreadParameter) do
       
if Assigned(FWorkerEvent) then
          FWorkerEvent(FSender);
    finally
      TThreadPool.TUserWorkItem(lpThreadParameter).Free;
   
end;
  except

  end;
end;

{
TThreadPool }

class procedure TThreadPool.QueueWorkItem(Sender: TObject; WorkerEvent: TNotifyEvent);
begin
  QueueWorkItem(Sender, WorkerEvent, WT_EXECUTEDEFAULT);
end;

class procedure TThreadPool.QueueIOWorkItem(Sender: TObject; WorkerEvent: TNotifyEvent);
begin
  QueueWorkItem(Sender, WorkerEvent, WT_EXECUTEINIOTHREAD);
end;

class procedure TThreadPool.QueueUIWorkItem(Sender: TObject; WorkerEvent: TNotifyEvent);
begin
  QueueWorkItem(Sender, WorkerEvent, WT_EXECUTEINUITHREAD);
end;

class procedure TThreadPool.QueueWorkItem(Sender: TObject; WorkerEvent: TNotifyEvent; Flags: ULONG);
var
  WorkItem: TUserWorkItem;
begin
 
if Assigned(WorkerEvent) then
 
begin
    IsMultiThread :
= True;
    WorkItem :
= TUserWorkItem.Create;
    try
      WorkItem.FWorkerEvent :
= WorkerEvent;
      WorkItem.FSender :
= Sender;
     
if not QueueUserWorkItem(InternalThreadFunction, WorkItem, Flags) then
        RaiseLastOSError;
    except
      WorkItem.Free;
      raise;
   
end;
end;
end;

procedure TForm3.Button1Click(Sender: TObject);
begin
  FIndex :
= PaintBox1.Height;
  PaintBox1.Repaint;
  ListBox1.Items.Clear;
  TWorkerColor.Create(Self, clBlue);
  TWorkerColor.Create(Self, clRed);
  TWorkerColor.Create(Self, clYellow);
  TWorkerColor.Create(Self, clLime);
  TWorkerColor.Create(Self, clFuchsia);
  TWorkerColor.Create(Self, clTeal);
end;

{
TForm3.TWorkerColor }

constructor TForm3.TWorkerColor.Create(AForm: TForm3; AColor: TColor);
begin
  FForm :
= AForm;
  FColor :
= AColor;
  TThreadPool.QueueWorkItem(Self, PaintLines);
end;

procedure TForm3.TWorkerColor.PaintLines(Sender: TObject);
var
  I: Integer;
begin
  FThreadID :
= GetCurrentThreadID;
 
for I := 0 to 9 do
 
begin
    PaintLine;
   
//TThread.Synchronize(nil, PaintLine);
    Sleep(
100);
 
end;
  Destroy;
end;

procedure TForm3.TWorkerColor.PaintLine;
begin
  FForm.PaintBox1.Canvas.Lock;
  try
    FForm.ListBox1.Items.Add(IntToStr(FThreadID));
   
with FForm.PaintBox1 do
   
begin
      Canvas.Pen.Color :
= FColor;
      Canvas.Polyline([Point(
0, FForm.FIndex), Point(Width, FForm.FIndex)]);
      Dec(FForm.FIndex);
     
if FForm.FIndex <= 0 then
        FForm.FIndex :
= 0;
   
end;
  finally
    FForm.PaintBox1.Canvas.Unlock;
 
end;
end;

end.

调用搞得太复杂,得弄一个简单的

转载于:https://www.cnblogs.com/MLKJ/archive/2010/11/30/1892433.html

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/192937.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • python psutil替代_python psutil

    python psutil替代_python psutil1、CPU1psutil.cpu_times(percpu=False)返回cpu使用时间元祖。若percpu=True,返回各个CPU的使用情况列表。1psutil.cpu_percent(interval,percpu)#返回CPU利用率2psutil.cpu_times_percent(interval=None,percpu=False)3psutil.cpu_count(lo…

    2022年6月7日
    30
  • QThread的用法

    概述QThread类提供了一个与平台无关的管理线程的方法。一个QThread对象管理一个线程。QThread的执行从run()函数的执行开始,在Qt自带的QThread类中,run()函数通过调用exec()函数来启动事件循环机制,并且在线程内部处理Qt的事件。在Qt中建立线程的主要目的就是为了用线程来处理那些耗时的后台操作,从而让主界面能及时响应用户的请求操作。下面就谈谈如何利用QT

    2022年4月3日
    94
  • 软件测试方法

    软件测试方法

    2021年6月29日
    74
  • 现货黄金贵金属投资入门基础知识

    现货黄金贵金属投资入门基础知识现货黄金贵金属投资入门知识:  很多中小投资者对证券投资都比较熟悉,但对现货黄金贵金属投资还不是很熟悉。现货吧给大家做一些简单的介绍。希望能为大家进入现货黄金贵金属投资的市场提供一些有益的参考和帮助。  现货黄金.jpg  黄金贵金属投资分为实物黄金和合约式黄金,投资实物黄金的可靠性较强,但买卖过程比较麻烦,而且还要自己承担保管的成本和风险,投资起来明显不如合约

    2022年5月8日
    27
  • 中国首批230135个绿色电力证书核发

    中国首批230135个绿色电力证书核发

    2022年3月4日
    68
  • simhash是什么_批复的适用情况

    simhash是什么_批复的适用情况需求是这样的:给出一个文档集合,以及一个领域概念集合,要求根据这些领域概念计算文档的相似性。首先想到的是利用余弦相似性计算。起初得到的集合有大概几万篇文档,如果对每对文档进行余弦相似度计算,会导致时间复杂度较高,于是发现了Simhash方法。由于已经给出了用于计算哈希值的关键词(即这些领域概念),就省去了对文章进行分词的步骤。每篇文档都用其领域概念列表计算出文档的哈希值,并使用这些

    2022年10月1日
    4

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号