在Delphi中使用Queued 组件

一个队列类的实现(比delphi自带的速度快70倍) 测试结果实现的代码 unit sfContnrs;interface{$DEFINE MULTI_THREAD_QUEUE} //线程安全版本,如果不需要线程安全,请注释掉此行代码{$IFDEF MULTI_THREAD_QUEUE}uses    Windo 阅读详情
 

在Delphi中使用Queued Components

队列组件(Queued Components)是一项基于微软消息队列服务(Microsoft Message Queuing Services)的COM+技术。它提供了一种简易的异步引用和执行组件的方法。发送方和接收方都不心考虑对方现在是否可用和能否获得而独立运行。

作为一项COM技术。队列指的是用于存储消息以便将来检索的空间。队列提供了一种非连接性的通讯机制(即发送方和接怍方之间并不是直接相连结,而是通过队列进行相互通讯)。队列负责存储信息直到接收方准备好为止。由于发送方和接收方之间不是直接通讯的,所以可以相互之间独立地运行,而不会影响到双方。

下面举例说明如何使用Delphi创建和使用队列组件。

首先,我们将创建一个服务器。接口中的所有方法必须仅使用IN参数,不能有返回值。这是由于客户端和服务器之间并没有直接的连结。因为不能确切地知道请求什么时候会被执行,所以客户端不能一直等待从服务器获得应答。

在Delphi中,首先打开file/new/other/activeX,创建一个ActiveX Library,然后,加入一个automation对象。为你的服务器对象取一个名称,比如QdComponent,其他的选项都使用默认值,单击OK.这时你将会看到Type Library Editor,添加一个方法,命名为Task1,为这个方法添加一个参数,命名为TaskMessage,设定其类型为BSTR(即Delphi中的WideString类型)。如果Type Library Options设置为show Pascal code,那么你的方法声明代码应与以下代码类似:

procedure task1(TaskMessage:widestring) [dispid $00000001];safecall;

保存项目文件为MyQdServer,单元文件为QdServer.

具体代码如下:

unit QdServer;

{$WARN SYMBOL_PLATFORM OFF}

interface

uses comobj,ActiveX,MyQdServer_TLB,stdvcl,Dialogs;

type

  TqdComponent=class(TautoObject,IQdComponent)

  Protected

Procedure Task1(const TaskMessage:widestring);safecall;

  End;

Implemention

Uses comServ;

Procedure TqdComponent.Task1(const TaskMessag:widestring);

Begin

  Showmessage(TaskMessage);

End;

Initialization

 TautoObjectFactory.Create(ComServer,TqdComponent,class_QdComponent

         CiMultiInstance,tmApartment);

End.

安装服务器

在控制面板中打开组件服务工具(Component Services Tool),在文件树中找到”COM+ Application”,然后右击,选择New/Application接着选择“Create an empty applcation”根据提示找到你的新程序,右击它,转到属性页,找到Queuing栏,选择复选框中的两项1.Queued 2.Listen.Listen表示任何被压入队列的消息,当它被击活时,将马上被处理。在你的新程序下右击“components”选择New/Component,选择“install new component(s)”,根据提示,找到并安装你的DLL文件,然后展开文件树找到“interface”,右击IqdComponent,打开属性页,在Queuing栏中选上”Queued”(如果看到出错提示信息“MSMQ IS NOT RUNNING”)那么很可能你没有安装MSMQ,因为MSMQ不是默认的WINDOWS 2000的安装选项。

创建客户端

创建一个新的Delphi应用程序,在uses子句中加入MyQdServer_tlb.pas单元文件,添加一个按钮和一个文本框。

你需要在程序运行时创建你的对象,所以使用一个符号变量来标记组件的信息,这个参数在FormShow事件处理函数中声明和使用。

具体代码如下:

unit unit1;

interface

uses

Windows,Messages,SysUtils,Variants,Classes,Graphics,Controls,Forms,

Dialogs,StdCtrls,Comobj,ActiveX,MyQdSever_TLB,

Type

  Tform1=class(TForm)

Edit1;Tedit;

Button1:Tbutton;

Procedure Button1Click(sender:Tobject);

Procedure FormShow(sender:TObject);

  Private

Qinterface:IqdComponent;

  Public

{Public declarations}

  end;

var

  form1:Tform1;

implemention

{$R*.dfm}

Function NewCoGetObject(pazName:PwideChar;pBindOptions:PbindOpts;

Const iid:TIID;out ppv):Hresult;stdcall;external ‘ole32.dll’ name‘CoGetOject’

Procedure Tform1.Button1Click(sender:TObject);

Begin

  Qinterface.task1(edit1.text);

End;

Procedure Tform1.FormShow(sender:Tobject);

Var

  Qmoniker:PwideChar;

Begin

  Qmoniker:=’Queue:/new{服务器的GUID或Server.interfaceName}’;

  Olecheck(NewCoGetObject(Qmoniker,nil,IqdComponent,Qinterface));

End;

End.

运行客户端程序,然后传送一条消息,由于此时你并没有启动服务器,所以这时并不能显示出来这条消息,需要启动服务器,而最简单的方法就是打开控制面板中的组件服务(Component Services),找到你的服务器,右击选择启动。

#这是我的第一份翻译作品,请不吝赐教。

 

 

 

 

 

 

delphi中关于队列的使用QUEUE delphi中关于队列的使用QUEUE,已在delphi7中调试通过。 学习queue的小例子。 立即下载

相关推荐

DELPHI之Tqueue的应用

Delphi之Tqueue Delphi之Tqueue

Delphi链表问题(队列)

    近来有好多同学问到在delphi中使用链表的问题,在这里我就简单来说说吧.   对C语言版的链表大家都很熟识了,我们就先来看看C关于链表的定义,这里以队列为例:   typedef struct Qnode{  //定义数据元素类型        int data;    struct Qnode  *next;}Qnode,*QueuePtr;typedef struct{       

readgomen的专栏 2168

【大唐杯学习超快速入门】5G技术原理仿真教学——5G网络开通调测与车联网

自用笔记,比较乱。

qq_41224270的博客 1万+

简略单纯高效的Delphi原子队列

本文供给Delphi一个基于原子操纵的无锁队列,简略单纯高效。实用于多线程大吞吐量操纵的队列。 科学是使人精力变得大胆的最好路子。可用于Android体系和32,64位Windows体系。   感激歼10和qsl供给了批改建议! 有如下题目: 1.必须实现开辟内存 2.队列大小必须是2的幂 3.不克不及压入空指针   unit utAtomFI

rocklee的专栏 4761

把群晖NAS变成游戏开发服务器:Perforce与虚幻引擎深度整合的5个关键配置(含.p4ignore模板)

本文详细介绍了如何将群晖NAS配置为游戏开发服务器,重点讲解了Perforce与虚幻引擎的深度整合。通过五个关键配置节点,包括用户权限架构、Workspace策略、资产同步优化、仓库清洁度保障和编辑器深度集成,帮助小型团队打造高效开发环境。文章还提供了实用的.p4ignore模板和优化技巧,显著提升开发效率。

weixin_30430677的博客 317

三维重建之条纹投影结构光(三)——相高模型标定

接上面两文: 三维重建之条纹投影结构光(一)https://blog.youkuaiyun.com/beyond951/article/details/123361852?spm=1001.2014.3001.5501三维重建之条纹投影结构光(二)——四步相移+三频外差法https://blog.youkuaiyun.com/beyond951/article/details/123769596?spm=1001.2014.3001.5501接下来对相高模型进行标定,其推导过程如下图所示 ...

beyond951的博客 4876

在Delphi中使用Queued 组件 (转)

在Delphi中使用Queued 组件 (转)[@more@] 在Delphi中使用Queued ComponentsXML:namespace prefix = o ns = "urn:schemas-microsoft...

csd3176的博客 163

Coze智能体开发:开始使用扣子

扣子全新升级!它不仅能帮你办公、做视频、写代码,更具备自主任务执行、探索进化等能力,真正从“陪你聊”走向“帮你干活”。

王国平的博客 123

delphi 把多个线程的请求阻塞到另一个线程 TElegantThread

本例是把多个线程访问数据库的请求,全部阻塞到一个线程。 这是实际编程中常见的一种问题。 示例源码下载,所需支持单元均在源码中,且附详细说明。 TElegantThread 的父类是 TSimpleThread。 1 unit uElegantThread; 2 3 interface 4 5 uses 6 Classes, SysUtils...

weixin_30641999的博客 380

Obsidian与RAG:知识管理的未来之战

摘要: 本文对比了传统RAG、Obsidian和llm-wiki-skill三种知识管理方案。传统RAG依赖查询时临时检索,知识无法积累;Obsidian需人工整理,成本高但结构化强;llm-wiki-skill通过AI在摄入时自动编译知识为结构化Wiki,实现持续增值。核心差异在于知识处理时机——llm-wiki-skill将"查询时检索"转变为"摄入时编译",通过三层Markdown结构(sources/concepts/entities)和自动双向链接构建可进化

ZhangJiqun&191cm&85kg 620

【系统分析师】2025年下半年真题:论文及解题思路

摘要 本文探讨软件测试技术的应用,重点关注静态测试与动态测试的比较。静态测试在不运行程序的情况下,通过审查、走查等方式分析需求、设计文档和代码,能早期发现高层次缺陷,降低修复成本。动态测试通过实际运行程序,使用单元测试、集成测试等方法验证功能性能,是发现运行时错误的唯一途径。二者在缺陷类型、介入阶段和修复成本上具有互补性,建议项目实践中结合使用以提升软件质量。

数据知道的博客 5788

学习笔记:delphi多线程知识

最近一直在温习旧的知识,刚好学习了一下Java的线程安全方面的知识,今天想起之前一直做的Delphi开发,所以还是有必要温习一下,看看这些不同的编程语言有什么不同之处。 Delphi的线程同步方法: 1、临界区 申明一个临界资源 FLock : TRTLCriticalSection; 先初化一个临界资源对象InitializeCriticalSection(FLock)销毁临...

weixin_33751566的博客 115

【Python】-- 趣味代码 - 发牌游戏

Python -- 趣味代码 - 发牌游戏

银尘博客 351

转:学习笔记:delphi多线程学识

学习笔记:delphi多线程知识 最近一直在温习旧的知识,刚好学习了一下Java的线程安全方面的知识,今天想起之前一直做的Delphi开发,所以还是有必要温习一下,看看这些不同的编程语言有什么不同之处。 Delphi的线程同步方法: 1、临界区 申明一个临界资源 FLock : TRTLCriticalSection; 先初化一个临界资源对象 InitializeCri...

weixin_34409703的博客 159

SAP BW/4HANA 项目字段级数据血缘分析的方法与工具

利用SAP自带工具可以在一定程度上查看数据流和字段使用情况,但往往需要人工逐步深挖。适用于简单场景或验证单个字段的映射。借助SAP数据治理解决方案(如 Information Steward、Data Intelligence 等)能够自动整合元数据,提供图形化、跨系统的血缘分析,适合对数据 lineage 有严格要求的企业级项目。第三方工具则提供了灵活强大的功能,如自动文档、生成功能丰富的报告,对于复杂环境下的血缘分析和影响分析非常有帮助。自行开发SQL/CDS脚本。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 471

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

你的第一个工作流

h3 创建描述符首先,让我们来定义工作流。你可以使用任何名字来命名工作流。一个工作流对应一个XML格式的定义文件。让我们来开始新建一个“myworkflow.xml”的文件,这是样板文件:"1.0" encoding="UTF-8"?><!DOCTYPE workflow PUBLIC "-//OpenSymphony Group//DTD OSWorkflow 2.7//EN"

JAVA&DELPHI 软件以用为本--Maker 1390

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

QueueUserAPC Function

  miranda-APC(异步过程调用)分析  APC : asynchronous procdure call 异步过程调用    Alertable IO(告警IO)提供了更有效的异步通知形式。ReadFileEx / WriteFileEx在发出IO请求的同时,    提供一个回调函数(APC过程)

asdfasdfsadf 1319

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

GetQueuedCompletionStatus的返回值

If the function dequeues a completion packet for a successful I/O operation from the completion port, the return value is nonzero. The function stores information in the variables pointed to by the lp

punklover的专栏 1022

HEVC代码跟踪(1)

咳咳,最先进入的当然是main,如下:

Moz_z的专栏 1405

ioctlsocket

ioctlsocket Function The ioctlsocket function controls the I/O mode of a socket. Syntax int ioctlsocket( __in SOCKET s, __in long cmd, __inout u_long *argp ); Parameters

584

阻塞队列BlockingQueue

文章目录介绍BlockingQueue接口BlockingQueue接口的实现ArrayBlockingQueue分析基本的数据结构阻塞的添加元素(put)阻塞的获取元素take()LinkedBlockingQueue分析底层数据结构put方法SynchronousQueuePriorityBlockingQueue 介绍 BlockingQueue阻塞队列,生产者消费者的体现 在这里面可以学习一下生产者与消费者模型 阻塞队列常用于 生产者和消费者的场景,生产者是向队列里添加元素的线程 消费者是从队列

ZHOUJIAN_TANK的博客 315

基于libuv的TCP设计(二)

一、本人设想的TCP服务器有如下特性: 1.启动服务,一直监听端口。 2.有新连接(客户端)就通知用户。并把连接接收到的数据回调给用户。 3.客户端连接上后用户可在任意时间发送数据给它。 4.客户端断开时关闭或用户可手动关掉。 以上操作都可以不同线程在完成。 二、使用libuv遇到的问题 由于对libuv不熟悉+其文档,调用其函数时吃了不少苦头。 1.libuv的特性 li...

weixin_30663391的博客 391

linux文件系统变化通知机制—inotify

概述   inotify — a powerful yet simple file change notification system. inotify是linux内核2.6.13以后支持的一种特性,功能是监视文件系统的变化,在监视到文件系统发生变化 以后,会向相应的应用程序发送变化事件。 inotify是一种文件系统的变化通知机制,如文件增加、删除等事件可以立刻让用户得知,该机制是著

zhangskd的专栏 1万+

06_自旋锁、队列自旋锁

没有锁的时候,线程的调度执行完成听令于CPU的时间片,此刻在他们线程函数中,同时对共享资源uDemo这个共享资源做访问并修改了。到底改成0x99还是0x88我们根本不知道。所以必须加锁,来确保某一时刻只有一个线程能改动。

成长需要沉淀。 213

以前用过的的一个线程池代码

#ifndef__THRMGR_H__#define__THRMGR_H__#include<pthread.h>#include<sys/time.h>#include<stdio.h>#include<time.h>#include<errno.h>#include"memory.h"#include<stdl...

weixin_30652271的博客 117

转MQTT--mosquitto服务器系统内容主题

MQTT客户端可以通过订阅位于$SYS层次下的主题来查看mosquitto服务器的状态信息。标记为Static的主题对于每一次订阅只发布一次。其它所有主题每隔sys_interval(在mosquitto.conf文件中配置)秒更新发布。如果sys_interval设置为0,系统就不发布更新。 $SYS中各主题说明如下: $SYS/broker/bytes/received 自服务器...

weixin_30443747的博客 383
aflash
博客等级 码龄26年 0粉丝 1原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值