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

一些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();

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

恩·艾克斯·红

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

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

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

打赏作者

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

抵扣说明:

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

余额充值