(按下Ctrl+C就重新配置dll服务2.0)

本文详细介绍了如何使用ACE库实现运行时动态加载和配置DLL服务,包括使用ACE_Reactor进行定时器和交互操作,通过Ctrl+C重新配置dll服务,并通过配置文件加载不同功能的服务实例。此外,文章提供了DLL工程的设置和配置文件svc.conf的使用方法,以及创建动态服务的代码示例。
部署运行你感兴趣的模型镜像

关于ACE可以实现运行时动态相应事件的原理请参考:

(1)ACE_Reactor实现计时器

(2)ACE_Reactor实现运行时交互

这里按下Ctrl+C来重新配置dll服务使用了:

(3)ACE_Reactor实现运行时交互

本文源代码下载http://pan.baidu.com/s/1gdgmV9D代码超级简单,直接编译运行Debug》Start Without Debuging

的方法实现运行相应键盘输入Ctrl+C,而重新配置则使用了ACE_Service_Config::reconfigure()方法,只要将此方法放到相应事件的处理程序(handle_signal)部分即可。如果要使ACE_Service_Config能够从配置文件加载服务,则服务必须是dll,而且服务内的类必须继承ACE_Service_Object,将要加载的服务放到重写了ACE_Service_Object的方法中之后,在配置文件中写配置指令就会和这里的方法一一对应。从而实现读取配置文件来使用dll中的不同功能。

在系统初始化的时候由ACE_Service_Config::open加载配置文件svc.conf中的配置信息

dynamic ParseProtocolA Service_Object * ParseProtocolA:_make_ParseProtocolA() ""

dynamic ParseProtocolB Service_Object * ParseProtocolB:_make_ParseProtocolB() ""

suspend ParseProtocolB

suspend ParseProtocolA

remove  ParseProtocolA

这里的ParseProtocolA和ParseProtocolB是两个dll,生成这两个dll需要两个工程分别如下:

注意创建DLL工程的时候要设置:

Setting->C/C++->Category(general)->preprocessor definitions:  YOURCLASSNAME_EXPORTS,ACE_BUILD_SVC_DLL

注意:这三个工程都需要完整的使用ACE的功能,所以这三个工程都要:

ACE在VS2010下快速配置三部曲:(这里假设你的ACE目录为E:\ACE_wrappers,即从网上下的ACE完整VS包)

(1)Properties》Configuration Properties》VC++ Directories》Include Directories》E:\ACE_wrappers

(2)Properties》Configuration Properties》VC++ Directories》Library Directories》E:\ACE_wrappers\lib

(3)Properties》Configuration Properties》Linker》Input》Additional  Dependencies》ACEd.lib

详细参考博客:http://blog.youkuaiyun.com/calmreason/article/details/38082009

除此之外,每个工程还需设置:

Manifest Tool》Input and OutPut》Embed Manifest》NO


ParseProtocolA工程,工程类型为dll

ParseProtocolA.h

#ifndef PARSEPROTOCOLA_H
#define PARSEPROTOCOLA_H

#include <iostream>
#include "ace/Service_Object.h"
#include "ace/svc_export.h"
using namespace std;

class ACE_Svc_Export  ParseProtocolA : public ACE_Service_Object 
{
public:
	ParseProtocolA(void);
	virtual ~ParseProtocolA(void);
	virtual int init (int argc, char *argv[])
	{
		cout<<"Parse Protocol A Obj::init"<<endl;
		return 0;
	}

	virtual int suspend()
	{
		cout<<"Parse Protocol A Obj::suspend"<<endl;
		return 0;
	}

	virtual int resume()
	{
		cout<<"Parse Protocol A Obj::resume"<<endl;
		return 0;
	}

	virtual int fini()
	{
		cout<<"Parse Protocol A Obj::fini"<<endl;
		return 0;
	}
};

 ACE_SVC_FACTORY_DECLARE(ParseProtocolA)

#endif

ParseProtocolA.cpp


#include "ParseProtocolA.h"


ParseProtocolA::ParseProtocolA(void)
{
}


ParseProtocolA::~ParseProtocolA(void)
{
}

ACE_SVC_FACTORY_DEFINE(ParseProtocolA)

注意:vs设置》C/C++》Preprocessor》Preprocessor  Definitions》添加》PARSEPROTOCOLA_EXPORTS

编译出错:LINK : error LNK2001: unresolved external symbol __DllMainCRTStartup@12,设置项目属性Linker》Advanced》No  Entry Point》Yes

ParseProtocolB工程,工程类型也为dll

ParseProtocolB.h

#ifndef PARSEPROTOCOLB_H
#define PARSEPROTOCOLB_H

#include <iostream>
#include "ace/Service_Object.h"
#include "ace/svc_export.h"
using namespace std;


class ACE_Svc_Export  ParseProtocolB: public ACE_Service_Object 
{
public:
	ParseProtocolB(void);
	virtual ~ParseProtocolB(void);
	virtual int init (int argc, char *argv[])
	{
		cout<<"Parse Protocol B Obj::init"<<endl;
		return 0;
	}

	virtual int suspend()
	{
		cout<<"Parse Protocol B Obj::suspend"<<endl;
		return 0;
	}

	virtual int resume()
	{
		cout<<"Parse Protocol B Obj::resume"<<endl;
		return 0;
	}

	virtual int fini()
	{
		cout<<"Parse Protocol B Obj::fini"<<endl;
		return 0;
	}
};

ACE_SVC_FACTORY_DECLARE(ParseProtocolB)


#endif

ParseProtocolB.cpp

#include "ParseProtocolB.h"


ParseProtocolB::ParseProtocolB(void)
{
}


ParseProtocolB::~ParseProtocolB(void)
{
}

ACE_SVC_FACTORY_DEFINE(ParseProtocolB)
注意:vs设置》C/C++》Preprocessor》Preprocessor  Definitions》添加》PARSEPROTOCOLB_EXPORTS

最后创建第三个项目UseService来动态的调用前面的两个dll服务

其中conf文件如下


conf文件内容


main.cpp

#include "ace/Reactor.h"
#include "ace/Event_Handler.h"
#include <iostream>
#include "ace/Service_Config.h"
#define SIGINT 2 //按下control + c  (系统已有定义的信号量)

class SignalHandler : public ACE_Event_Handler  
{  

public:  
	//构造函数时注册信号,当此信号发生时(用户按下Ctrl+C时)被ACE_Reactor捕捉到
	//同事调用此类的handle_signal方法
	SignalHandler()  
	{  
		reactor()->instance()->register_handler(SIGINT,this);
	}  
	int handle_signal(int signum, siginfo_t*,ucontext_t*) //处理信号
	{
		switch(signum)
		{
		case SIGINT: 
			{
				std::cout<<"You pressed SIGINT(Ctrl+C)\n";
				ACE_Service_Config::reconfigure();
			}
			break;
		}
		return 0;
	} 
};  


int ACE_TMAIN (int argc, ACE_TCHAR *argv[]) 
{

	if (ACE_Service_Config::open (argc, argv) == -1)
		ACE_ERROR_RETURN ((LM_ERROR,"%p\n","ACE_Service_Config::open"),-1);
	//对不起看官:下面创建对象的这一句话在之前没有加上,
	//今天发现了特意加上,因为我自己也因为这一句话没写而反复调试了多遍
	//2014/4/1
	SignalHandler* signalhandler = new SignalHandler();
	
	ACE_Reactor::instance ()->run_reactor_event_loop();
	return 0;
}


修改配置文件如下

dynamic ParseProtocolA Service_Object * ParseProtocolA:_make_ParseProtocolA() ""

dynamic ParseProtocolB Service_Object * ParseProtocolB:_make_ParseProtocolB() ""

suspend ParseProtocolB

suspend ParseProtocolA

remove  ParseProtocolA

remove  ParseProtocolB

按Ctrl+C

新的输出如下:可见最后一行多了remove B的相应信息




您可能感兴趣的与本文相关的镜像

ACE-Step

ACE-Step

音乐合成
ACE-Step

ACE-Step是由中国团队阶跃星辰(StepFun)与ACE Studio联手打造的开源音乐生成模型。 它拥有3.5B参数量,支持快速高质量生成、强可控性和易于拓展的特点。 最厉害的是,它可以生成多种语言的歌曲,包括但不限于中文、英文、日文等19种语言

<think>我们正在配置Windows11上的VSCode以支持GTK开发。GTK是一个用于创建图形用户界面的库,通常用于Linux,但也可以在Windows上使用。步骤:1.安装必要的软件:VSCode、MinGW(或MSYS2,这里推荐使用MSYS2,因为它可以方便地安装GTK)、GTK本身。2.配置环境变量。3.配置VSCode的任务和调试环境。由于引用中提到了两种方法(VS和CodeBlocks),但用户要求使用VS Code,因此我们将使用MSYS2来安装GTK,然后在VS Code中配置。详细步骤:第一步:安装MSYS2从MSYS2官网(https://www.msys2.org/)下载并安装。按照网站上的说明进行安装,然后更新系统。第二步:安装GTK在MSYS2终端中,运行以下命令安装GTK(这里以GTK3为例,如果需要GTK4可以相应调整):pacman-Smingw-w64-x86_64-gtk3第三步:安装MinGW工具链(如果还没有的话)在MSYS2中,我们可以安装MinGW-w64工具链:pacman -S mingw-w64-x86_64-toolchain第四步:安装VS Code并配置C/C++扩展安装VSCode,然后安装C/C++扩展(由Microsoft提供)。第五步:配置环境变量将MSYS2的MinGW-w64的bin目录(例如:C:\msys64\mingw64\bin)添加到系统的PATH环境变量中。这样我们就可以在VSCode的终端中使用gcc和GTK库。第六步:创建一个简单的GTK程序例如,创建一个名为`main.c`的文件:```c#include <gtk/gtk.h> staticvoid activate(GtkApplication *app,gpointeruser_data) {GtkWidget*window=gtk_application_window_new(app);gtk_window_set_title(GTK_WINDOW(window),"Window");gtk_window_set_default_size(GTK_WINDOW(window),200,200);gtk_widget_show_all(window); }int main(int argc, char**argv) {GtkApplication*app= gtk_application_new("org.gtk.example",G_APPLICATION_FLAGS_NONE);g_signal_connect(app, "activate",G_CALLBACK(activate), NULL);int status= g_application_run(G_APPLICATION(app), argc, argv);g_object_unref(app);returnstatus;} ```第七步:配置VSCode的tasks.json(用于编译)在VS Code中,按Ctrl+Shift+P,选择“Tasks: ConfigureDefault BuildTask”,然后选择“Createtasks.jsonfile fromtemplate”-> “Others”。然后编辑tasks.json如下: ```json{"version": "2.0.0","tasks":[{"label": "build","type":"shell","command": "gcc","args": ["-o","hello_gtk", "main.c","`pkg-config--cflags gtk+-3.0`","`pkg-config--libs gtk+-3.0`"],"group": {"kind":"build","isDefault":true}}]} ```注意:上面的命令使用了pkg-config,这需要我们在MSYS2环境中运行。但是,在VS Code的终端中,如果我们已经将MSYS2的bin目录添加到PATH,那么应该可以找到pkg-config。然而,在Windows的命令提示符或PowerShell中,反引号(`)可能不被正确解释。因此,我们可以改为使用一个shell脚本来运行,或者使用MSYS2的终端。另一种方法是直接写出pkg-config的输出。我们可以先手动运行一次,获取参数:pkg-config--cflags gtk+-3.0#得到包含路径pkg-config--libs gtk+-3.0#得到链接库例如,输出可能是:-IC:/msys64/mingw64/include/gtk-3.0... (其他包含路径)-LC:/msys64/mingw64/lib -lgtk-3 ...(其他库)然后我们可以将这些参数直接写入tasks.json的args中。但是这样会使得任务不灵活,如果GTK更新了,参数可能需要改变。更好的方法:我们可以使用一个bash脚本来编译,或者配置VS Code使用MSYS2的bash作为终端。第八步:配置VS Code使用MSYS2的bash作为默认终端在VS Code中,按Ctrl+,打开设置,搜索“terminalintegratedshellwindows”,然后添加设置:"terminal.integrated.profiles.windows": {"msys2":{"path": "C:\\msys64\\usr\\bin\\bash.exe","args": ["-i"]}},"terminal.integrated.defaultProfile.windows":"msys2"然后,在tasks.json中,我们可以将命令改为在bash中运行:```json{"version": "2.0.0","tasks":[{"label": "build","type":"shell","command": "gcc-o hello_gtk main.c `pkg-config --cflagsgtk+-3.0` `pkg-config --libsgtk+-3.0`","group":{"kind": "build","isDefault": true},"presentation":{"echo": true,"reveal":"always","focus": false,"panel": "shared","showReuseMessage": true,"clear": true}}]} ```这样,当我们运行构建任务时,VS Code会使用MSYS2的bash终端来执行命令,这样反引号就可以被正确解析。第九步:调试配置(可选)如果需要调试,我们可以配置launch.json。首先确保安装了C/C++扩展。然后创建一个launch.json文件(在运行和调试视图中点击“创建launch.json文件”),选择C++ (GDB/LLDB)。然后编辑launch.json: ```json{"version": "0.2.0","configurations": [{"name":"(gdb) Launch","type": "cppdbg","request":"launch","program":"${workspaceFolder}/hello_gtk.exe","args": [],"stopAtEntry":false,"cwd": "${workspaceFolder}","environment": [],"externalConsole": false,"MIMode": "gdb","miDebuggerPath":"gdb","setupCommands": [{"description":"Enablepretty-printing forgdb","text": "-enable-pretty-printing","ignoreFailures": true}],"preLaunchTask": "build"}]} ```注意:调试需要安装gdb,可以通过MSYS2安装(mingw-w64-x86_64-gdb)。第十步:运行和调试按F5启动调试,或者运行构建任务(Ctrl+Shift+B)后,在终端中运行生成的hello_gtk.exe。注意事项:-确保环境变量配置正确,特别是PATH中包含了MSYS2的mingw64\bin目录。 -如果遇到pkg-config找不到的问题,请检查MSYS2中是否安装了pkg-config(mingw-w64-x86_64-pkg-config)。以上步骤应该可以帮助在Windows11上使用VSCode配置GTK开发环境。相关问题:1.如何在Windows上使用GTK4进行开发?2.如何配置VS Code以调试GTK应用程序?3.在Windows上使用GTK开发有哪些常见问题及解决方法?</think>### Windows 11下VS Code配置GTK开发环境指南 #### 步骤1:安装MSYS2(GTK开发环境基础) 1. 访问[MSYS2官网](https://www.msys2.org/)下载安装包 2. 安装到默认路径(如 `C:\msys64`) 3. 打开 **MSYS2 MinGW x64** 终端,执行更新: ```bash pacman -Syu pacman -Su ``` #### 步骤2:安装GTK和编译工具 在MSYS2终端中执行: ```bash pacman -S mingw-w64-x86_64-gtk3 mingw-w64-x86_64-toolchain mingw-w64-x86_64-pkg-config ``` 这将安装: - GTK3开发库 - GCC编译工具链 - pkg-config配置工具 #### 步骤3:配置环境变量 1. 添加系统环境变量: ``` Path = C:\msys64\mingw64\bin; [原有路径] ``` 2. 验证安装(新终端中执行): ```bash gcc --version # 应显示MinGW GCC pkg-config --version # 应显示版本号 ``` #### 步骤4:VS Code配置 1. **安装扩展**: - C/C++ (Microsoft) - CMake Tools (可选) 2. **创建编译任务**(`.vscode/tasks.json`): ```json { "version": "2.0.0", "tasks": [{ "label": "Build GTK", "type": "shell", "command": "gcc", "args": [ "${file}", "-o", "${fileDirname}/${fileBasenameNoExtension}.exe", "$(pkg-config --cflags --libs gtk+-3.0)" ], "group": { "kind": "build", "isDefault": true } }] } ``` 3. **配置智能感知**(`.vscode/c_cpp_properties.json`): ```json { "configurations": [{ "name": "MinGW", "includePath": [ "${env:MSYS2_PATH}/mingw64/include/gtk-3.0", "${env:MSYS2_PATH}/mingw64/lib/glib-2.0/include" ], "compilerPath": "${env:MSYS2_PATH}/mingw64/bin/gcc.exe" }] } ``` #### 步骤5:创建测试程序 1. 新建 `hello_gtk.c`: ```c #include <gtk/gtk.h> int main(int argc, char *argv[]) { gtk_init(&argc, &argv); GtkWidget *window = gtk_window_new(GTK_WINDOW_TOPLEVEL); gtk_window_set_title(GTK_WINDOW(window), "VS Code GTK测试"); g_signal_connect(window, "destroy", G_CALLBACK(gtk_main_quit), NULL); gtk_widget_show_all(window); gtk_main(); return 0; } ``` 2. 按 `Ctrl+Shift+B` 编译 3. 终端运行: ```bash ./hello_gtk.exe ``` #### 常见问题解决 - **pkg-config报错**:确认MSYS2路径正确,重启VS Code使环境变量生效[^1] - **头文件缺失**:检查 `c_cpp_properties.json` 中的include路径 - **运行时崩溃**:确保 `mingw64/bin` 下所有DLL与可执行文件在同一目录 > 配置成功效果:窗口显示标题为"VS Code GTK测试"的空白窗口,关闭窗口后程序退出[^2]。
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

C++程序员Carea

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值