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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • java代码是怎么运行的_java代码是什么

    java代码是怎么运行的_java代码是什么1.Java代码有很多不同的运行方式1)可以在开发工具中运行2)可以双击执行jar文件运行,3)也可以在命令行中运行4)甚至可以在网页中运行这些执行方式都离不开JRE,也就是Java的运

    2022年8月1日
    3
  • 滤波算法(四)—— 卡尔曼滤波算法

    滤波算法(四)—— 卡尔曼滤波算法一、算法介绍卡尔曼滤波是一个神奇的滤波算法,应用非常广泛,它是一种结合先验经验、测量更新的状态估计算法。1、状态估计首先,对于一个我们关心的物理量,我们假设它符合下面的规律其中,为该物理量本周期的实际值,为该物理量上一个周期的实际值,当然这个物理量可能不符合这个规律,我们只是做了一个假设。不同的物理量符合的规律不同,是我们的经验,我们根据这个规律…

    2022年6月13日
    53
  • Fiddler抓包原理解析

    Fiddler抓包原理解析

    2021年10月5日
    51
  • 什么是pnp问题_pnp什么意思

    什么是pnp问题_pnp什么意思点击关注上方“五分钟学算法”,设为“置顶或星标”,第一时间送达干货。转自后端技术指南针1前言今天和大家一起了解个高能知识点:P=NP问题。看到这里我们可能是一头雾水,不由得发问:P问题…

    2022年8月10日
    61
  • java mencoder_mencoder java linux[通俗易懂]

    java mencoder_mencoder java linux[通俗易懂]在执行转化的时候只能转化1分钟的影片超过1分钟影片的都不能转化。可是直接输入命令行又能全部转化。高分求解try{Runtimert=Runtime.getRuntime();Processproc=rt.exec(“mencoder”+ol…在执行转化的时候只能转化1分钟的影片超过1分钟影片的都不能转化。可是直接输入命令行又能全部转化。高分求解try{Runtimert=Runtime….

    2025年6月11日
    3
  • Node入门教程(11)第九章:Node 的网络模块

    Node入门教程(11)第九章:Node 的网络模块

    2022年4月2日
    41

发表回复

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

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