许可优化
许可优化
产品
产品
解决方案
解决方案
服务支持
服务支持
关于
关于
软件库
当前位置:服务支持 >  软件文章 >  NX/UG二次开发—其他—在NX中实现多线程的简单案例

NX/UG二次开发—其他—在NX中实现多线程的简单案例

阅读数 6
点赞 0
article_banner

一些 NX 使用者,经常提出一个需求,在NX的顶部标题栏显示当前显示部件的全路径,网上也有一些类似外挂或实现方法,比如利用定时器不断刷新,但这个方法存在一个弊端就是有时候会有明显卡顿。

通过测试,发现其他两种方式:1、使用多线程来代替定时器。2、 注册 切换模块回调、注册文件打开回调,在回调函数中设置。此处介绍一下多线程的方式。

1、首先更改卸载方式,如下

extern "C" DllExport int ufusr_ask_unload(){	return (int)Session::LibraryUnloadOptionAtTermination;	}

2、使用入口函数ufsta,并在入口函数中启动线程

HANDLE findThread = (HANDLE)_beginthreadex(NULL, 0, EditTitleThread, NULL, 0, NULL);CloseHandle(findThread);

3、定义和声明线程执行函数“EditTitleThread”,此处设置为1s刷新一次

UINT EditTitleThread(LPVOID pParam){	AFX_MANAGE_STATE(AfxGetStaticModuleState());	int sleepTime = 1000;	while (g_isContinue)	{		tag_t t_workPart = CONTEXT_ask_work_part();		if (t_workPart)		{			char* partName = PART_ask_filename_of_part(t_workPart);			g_ugCwnd->SetWindowText(UTF8ToGBK(partName).c_str());			SM_free(partName);		}		else		{			g_ugCwnd->SetWindowText("NX");		}		Sleep(sleepTime);	}	return 0;}

通过以上几部完成程序主体功能,其中一些开发人员表示,在线程中执行NX函数会报错,通过测试,确实存在这个问题,但对于一些检查获取函数,测试过程并没有报错。比如获取组件路径的UF函数。

此处我使用的是dll导出函数,测试也是正常运行。上述用到的导出函数如下:

//加载HINSTANCE g_NxInterF_libpart_dll = LoadLibrary("libpart.dll");HINSTANCE g_NxInterF_libsyss_dll = LoadLibrary("libsyss.dll");  //导出typedef char* (*PART_ask_filename_of_part_P)(tag_t);PART_ask_filename_of_part_P PART_ask_filename_of_part = NULL;PART_ask_filename_of_part = (PART_ask_filename_of_part_P)::GetProcAddress(g_NxInterF_libpart_dll, "?PART_ask_filename_of_part@@YAPEADI@Z");	  //导出typedef tag_t (*CONTEXT_ask_work_part_P)(void);CONTEXT_ask_work_part_P CONTEXT_ask_work_part = NULL;CONTEXT_ask_work_part = (CONTEXT_ask_work_part_P)::GetProcAddress(g_NxInterF_libpart_dll, "?CONTEXT_ask_work_part@@YAIXZ");  //导出typedef void (*SM_free_P)(void* );SM_free_P SM_free = NULL;SM_free = (SM_free_P)::GetProcAddress(g_NxInterF_libsyss_dll, "?SM_free@@YAXPEAX@Z");   //卸载FreeLibrary(g_NxInterF_libpart_dll);g_NxInterF_libpart_dll = NULL;FreeLibrary(g_NxInterF_libsyss_dll);g_NxInterF_libsyss_dll = NULL;

注意其中获取文件路径函数,返回的char*值为UTF8编码,如果是多字符集,注意需要 转换 一下:

string UTF8ToGBK(const char* strUTF8){	int len = MultiByteToWideChar(CP_UTF8, 0, strUTF8, -1, NULL, 0);	wchar_t* wszGBK = new wchar_t[len + 1];	memset(wszGBK, 0, len * 2 + 2);	MultiByteToWideChar(CP_UTF8, 0, strUTF8, -1, wszGBK, len);	len = WideCharToMultiByte(CP_ACP, 0, wszGBK, -1, NULL, 0, NULL, NULL);	char* szGBK = new char[len + 1];	memset(szGBK, 0, len + 1);	WideCharToMultiByte(CP_ACP, 0, wszGBK, -1, szGBK, len, NULL, NULL);	string strTemp(szGBK);	if (wszGBK) delete[] wszGBK;	if (szGBK) delete[] szGBK;	return strTemp;}

获取NX窗口句柄:

HWND hParentWndXX = (HWND)UF_UI_get_default_parent();


免责声明:本文系网络转载或改编,未找到原创作者,版权归原作者所有。如涉及版权,请联系删


相关文章
技术文档
QR Code
微信扫一扫,欢迎咨询~
customer

online

联系我们
武汉格发信息技术有限公司
湖北省武汉市经开区科技园西路6号103孵化器
电话:155-2731-8020 座机:027-59821821
邮件:tanzw@gofarlic.com
Copyright © 2023 Gofarsoft Co.,Ltd. 保留所有权利
遇到许可问题?该如何解决!?
评估许可证实际采购量? 
不清楚软件许可证使用数据? 
收到软件厂商律师函!?  
想要少购买点许可证,节省费用? 
收到软件厂商侵权通告!?  
有正版license,但许可证不够用,需要新购? 
联系方式 board-phone 155-2731-8020
close1
预留信息,一起解决您的问题
* 姓名:
* 手机:

* 公司名称:

姓名不为空

姓名不为空

姓名不为空
手机不正确

手机不正确

手机不正确
公司不为空

公司不为空

公司不为空