网站免费云主机跨境电商平台设计

张小明 2026/3/2 18:18:27
网站免费云主机,跨境电商平台设计,专门做特产的网站,wordpress get field添加线程安全结束代码的原因#xff1a;1.如果对话框关闭时线程仍在运行#xff0c;访问已释放内存程序崩溃#xff01;2. 资源泄漏风险如线程句柄未关闭、内存未释放、 GDI对象未释放、文件句柄未关闭#xff0c;程序看似关闭#xff0c;但进程仍在后台运行#xff0c;再…添加线程安全结束代码的原因1.如果对话框关闭时线程仍在运行访问已释放内存程序崩溃2. 资源泄漏风险如线程句柄未关闭、内存未释放、 GDI对象未释放、文件句柄未关闭程序看似关闭但进程仍在后台运行再次启动程序可能失败。这里增加一个SafeTerminateThread()函数用于线程安全结束在对话框析构函数、OnDestroy消息处理、及停止按钮中调用于线程安全函数。改进后完整代码如下。SimpleThreadDemoDlg.h// SimpleThreadDemoDlg.h : header file//#if!defined(AFX_SIMPLETHREADDEMODLG_H__1FDB3406_48D0_44E7_9CE2_1977BCCA5492__INCLUDED_)#defineAFX_SIMPLETHREADDEMODLG_H__1FDB3406_48D0_44E7_9CE2_1977BCCA5492__INCLUDED_#if_MSC_VER1000#pragmaonce#endif// _MSC_VER 1000/////////////////////////////////////////////////////////////////////////////// CSimpleThreadDemoDlg dialogclassCSimpleThreadDemoDlg:publicCDialog{// Constructionpublic:CSimpleThreadDemoDlg(CWnd*pParentNULL);// standard constructorvirtual~CSimpleThreadDemoDlg();// 析构函数// 线程句柄HANDLE m_hThread;// 事件对象用于线程同步HANDLE m_hStopEvent;// 线程控制标志// 线程控制BOOL m_bStopThread;// TRUE表示线程应该停止BOOL m_bThreadActive;// TRUE表示线程正在运行// 线程参数结构structTHREAD_PARAM{CSimpleThreadDemoDlg*pDlg;intnCounter;};private:// 添加安全终止方法voidSafeTerminateThread();// 静态线程函数staticUINTThreadProc(LPVOID pParam);// 线程工作函数voidDoThreadWork(intnIteration);// Dialog Data//{{AFX_DATA(CSimpleThreadDemoDlg)enum{IDDIDD_SIMPLETHREADDEMO_DIALOG};// NOTE: the ClassWizard will add data members here//}}AFX_DATA// ClassWizard generated virtual function overrides//{{AFX_VIRTUAL(CSimpleThreadDemoDlg)protected:virtualvoidDoDataExchange(CDataExchange*pDX);// DDX/DDV support//}}AFX_VIRTUAL// Implementationprotected:HICON m_hIcon;// Generated message map functions//{{AFX_MSG(CSimpleThreadDemoDlg)virtualBOOLOnInitDialog();afx_msgvoidOnSysCommand(UINT nID,LPARAM lParam);afx_msgvoidOnPaint();afx_msg HCURSOROnQueryDragIcon();afx_msgvoidOnButtonStart();afx_msgvoidOnButtonStop();afx_msgvoidOnDestroy();//}}AFX_MSGDECLARE_MESSAGE_MAP()};//{{AFX_INSERT_LOCATION}}// Microsoft Visual C will insert additional declarations immediately before the previous line.#endif// !defined(AFX_SIMPLETHREADDEMODLG_H__1FDB3406_48D0_44E7_9CE2_1977BCCA5492__INCLUDED_)SimpleThreadDemoDlg.cpp// SimpleThreadDemoDlg.cpp : implementation file//#includestdafx.h#includeSimpleThreadDemo.h#includeSimpleThreadDemoDlg.h#ifdef_DEBUG#definenewDEBUG_NEW#undefTHIS_FILEstaticcharTHIS_FILE[]__FILE__;#endif// 线程参数结构体/////////////////////////////////////////////////////////////////////////////// CAboutDlg dialog used for App AboutclassCAboutDlg:publicCDialog{public:CAboutDlg();// Dialog Data//{{AFX_DATA(CAboutDlg)enum{IDDIDD_ABOUTBOX};//}}AFX_DATA// ClassWizard generated virtual function overrides//{{AFX_VIRTUAL(CAboutDlg)protected:virtualvoidDoDataExchange(CDataExchange*pDX);// DDX/DDV support//}}AFX_VIRTUAL// Implementationprotected://{{AFX_MSG(CAboutDlg)//}}AFX_MSGDECLARE_MESSAGE_MAP()};CAboutDlg::CAboutDlg():CDialog(CAboutDlg::IDD){//{{AFX_DATA_INIT(CAboutDlg)//}}AFX_DATA_INIT}voidCAboutDlg::DoDataExchange(CDataExchange*pDX){CDialog::DoDataExchange(pDX);//{{AFX_DATA_MAP(CAboutDlg)//}}AFX_DATA_MAP}BEGIN_MESSAGE_MAP(CAboutDlg,CDialog)//{{AFX_MSG_MAP(CAboutDlg)// No message handlers//}}AFX_MSG_MAPEND_MESSAGE_MAP()/////////////////////////////////////////////////////////////////////////////// CSimpleThreadDemoDlg dialogCSimpleThreadDemoDlg::CSimpleThreadDemoDlg(CWnd*pParent/*NULL*/):CDialog(CSimpleThreadDemoDlg::IDD,pParent){//{{AFX_DATA_INIT(CSimpleThreadDemoDlg)m_bStopThreadFALSE;// 不要停止m_bThreadActiveFALSE;// 线程不在运行m_hThreadNULL;//}}AFX_DATA_INIT// Note that LoadIcon does not require a subsequent DestroyIcon in Win32m_hIconAfxGetApp()-LoadIcon(IDR_MAINFRAME);}voidCSimpleThreadDemoDlg::DoDataExchange(CDataExchange*pDX){CDialog::DoDataExchange(pDX);//{{AFX_DATA_MAP(CSimpleThreadDemoDlg)// NOTE: the ClassWizard will add DDX and DDV calls here//}}AFX_DATA_MAP}BEGIN_MESSAGE_MAP(CSimpleThreadDemoDlg,CDialog)//{{AFX_MSG_MAP(CSimpleThreadDemoDlg)ON_WM_SYSCOMMAND()ON_WM_PAINT()ON_WM_QUERYDRAGICON()ON_BN_CLICKED(IDC_BUTTON_START,OnButtonStart)ON_BN_CLICKED(IDC_BUTTON_STOP,OnButtonStop)ON_WM_DESTROY()//}}AFX_MSG_MAPEND_MESSAGE_MAP()/////////////////////////////////////////////////////////////////////////////// CSimpleThreadDemoDlg message handlersBOOLCSimpleThreadDemoDlg::OnInitDialog(){CDialog::OnInitDialog();// Add About... menu item to system menu.// IDM_ABOUTBOX must be in the system command range.ASSERT((IDM_ABOUTBOX0xFFF0)IDM_ABOUTBOX);ASSERT(IDM_ABOUTBOX0xF000);CMenu*pSysMenuGetSystemMenu(FALSE);if(pSysMenu!NULL){CString strAboutMenu;strAboutMenu.LoadString(IDS_ABOUTBOX);if(!strAboutMenu.IsEmpty()){pSysMenu-AppendMenu(MF_SEPARATOR);pSysMenu-AppendMenu(MF_STRING,IDM_ABOUTBOX,strAboutMenu);}}// Set the icon for this dialog. The framework does this automatically// when the applications main window is not a dialogSetIcon(m_hIcon,TRUE);// Set big iconSetIcon(m_hIcon,FALSE);// Set small icon// TODO: Add extra initialization herereturnTRUE;// return TRUE unless you set the focus to a control}voidCSimpleThreadDemoDlg::OnSysCommand(UINT nID,LPARAM lParam){if((nID0xFFF0)IDM_ABOUTBOX){CAboutDlg dlgAbout;dlgAbout.DoModal();}else{CDialog::OnSysCommand(nID,lParam);}}// If you add a minimize button to your dialog, you will need the code below// to draw the icon. For MFC applications using the document/view model,// this is automatically done for you by the framework.voidCSimpleThreadDemoDlg::OnPaint(){if(IsIconic()){CPaintDCdc(this);// device context for paintingSendMessage(WM_ICONERASEBKGND,(WPARAM)dc.GetSafeHdc(),0);// Center icon in client rectangleintcxIconGetSystemMetrics(SM_CXICON);intcyIconGetSystemMetrics(SM_CYICON);CRect rect;GetClientRect(rect);intx(rect.Width()-cxIcon1)/2;inty(rect.Height()-cyIcon1)/2;// Draw the icondc.DrawIcon(x,y,m_hIcon);}else{CDialog::OnPaint();}}// The system calls this to obtain the cursor to display while the user drags// the minimized window.HCURSORCSimpleThreadDemoDlg::OnQueryDragIcon(){return(HCURSOR)m_hIcon;}// 线程函数UINTCSimpleThreadDemoDlg::ThreadProc(LPVOID pParam){THREAD_PARAM*pThreadParam(THREAD_PARAM*)pParam;CSimpleThreadDemoDlg*pDlgpThreadParam-pDlg;TRACE(线程开始运行\n);// 执行5次循环for(inti1;i5;i){// 检查停止标志if(pDlg-m_bStopThread){TRACE(线程接收到停止信号\n);break;}// 执行工作pDlg-DoThreadWork(i);// 休眠1秒Sleep(1000);}// 线程结束更新状态pDlg-m_bThreadActiveFALSE;// 清理参数deletepThreadParam;TRACE(线程运行结束\n);return0;}voidCSimpleThreadDemoDlg::DoThreadWork(intnIteration){TRACE(执行第%d项工作\n,nIteration);// 这里可以添加实际的工作代码}/////////////////////////////////////////////////////////////////////////////// 启动线程voidCSimpleThreadDemoDlg::OnButtonStart(){TRACE( 启动线程 \n);TRACE( 启动线程 \n);if(m_bThreadActive){AfxMessageBox(线程已经在运行);return;}// 重置事件if(m_hStopEvent){ResetEvent(m_hStopEvent);}// 初始化标志m_bStopThreadFALSE;// 不要停止m_bThreadActiveTRUE;// 线程正在运行// 创建线程参数// 创建线程参数THREAD_PARAM*pParamnewTHREAD_PARAM;pParam-pDlgthis;pParam-nCounter0;// 创建线程使用CREATE_SUSPENDED确保完全初始化后再运行CWinThread*pThreadAfxBeginThread(ThreadProc,pParam,THREAD_PRIORITY_NORMAL,0,CREATE_SUSPENDED);if(pThreadNULL){AfxMessageBox(创建线程失败);m_bThreadActiveFALSE;deletepParam;return;}// 保存句柄m_hThreadpThread-m_hThread;// 恢复线程运行pThread-ResumeThread();TRACE(线程启动成功ID: %d\n,pThread-m_nThreadID);AfxMessageBox(线程已启动);}/////////////////////////////////////////////////////////////////////////////// 停止线程voidCSimpleThreadDemoDlg::OnButtonStop(){TRACE( 停止线程 \n);if(!m_bThreadActive){AfxMessageBox(没有正在运行的线程);return;}// 安全终止线程SafeTerminateThread();AfxMessageBox(线程已停止);}voidCSimpleThreadDemoDlg::SafeTerminateThread(){TRACE(安全终止线程\n);if(!m_bThreadActive){TRACE(线程未激活\n);return;}// 1. 设置停止标志和事件m_bStopThreadTRUE;if(m_hStopEvent){SetEvent(m_hStopEvent);}// 2. 等待线程正常结束if(m_hThread){TRACE(等待线程正常退出...\n);// 等待3秒让线程正常退出DWORD dwWaitResultWaitForSingleObject(m_hThread,3000);if(dwWaitResultWAIT_OBJECT_0){TRACE(线程正常退出\n);}elseif(dwWaitResultWAIT_TIMEOUT){TRACE(线程超时未退出尝试强制终止\n);// 3. 强制终止最后手段// 警告这可能导致资源泄漏只在必要时使用if(!TerminateThread(m_hThread,0)){TRACE(强制终止失败错误代码: %d\n,GetLastError());}else{// 等待线程完全终止WaitForSingleObject(m_hThread,1000);TRACE(线程已被强制终止\n);}}// 4. 关闭句柄CloseHandle(m_hThread);m_hThreadNULL;}// 5. 重置状态m_bThreadActiveFALSE;m_bStopThreadFALSE;TRACE(安全终止线程完成\n);}voidCSimpleThreadDemoDlg::OnDestroy(){TRACE( 窗口销毁处理开始 \n);// 确保线程结束SafeTerminateThread();CDialog::OnDestroy();TRACE( 窗口销毁处理结束 \n);}CSimpleThreadDemoDlg::~CSimpleThreadDemoDlg(){// 确保线程结束if(m_bThreadActivem_hThread){// 设置停止事件SetEvent(m_hStopEvent);// 等待线程结束最多等待5秒DWORD dwWaitWaitForSingleObject(m_hThread,5000);if(dwWaitWAIT_TIMEOUT){// 如果线程在5秒内没有结束强制终止TerminateThread(m_hThread,0);TRACE(线程被强制终止\n);}// 关闭句柄CloseHandle(m_hThread);m_hThreadNULL;}// 关闭事件句柄if(m_hStopEvent){CloseHandle(m_hStopEvent);m_hStopEventNULL;}}Debug模式运行
版权声明:本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

网站建设公司的运营方式青岛市建设监督管理局网站

变革中的测试管理格局 随着数字化转型进程的加速和敏捷DevOps实践的普及,2025年的软件测试领域正经历着前所未有的范式转移。传统的测试管理方式已难以应对快速迭代的发布节奏、日益复杂的系统架构和不断提高的质量要求。在这一背景下,测试管理创新不再…

张小明 2025/12/31 3:46:28 网站建设

公司微网站制作制作公司网站一般多久能好

你是否曾经面对一堆密密麻麻的数据表格,却不知道如何从中提取有价值的信息?📊 你是否羡慕那些能够用图表清晰展示数据洞察的同事?别担心,今天我要向你介绍一个革命性的工具——Data Formulator,它将彻底改变…

张小明 2026/1/9 5:49:46 网站建设

医疗网站建设案例深圳网站优化方式

Linux实用软件与图像处理全攻略 一、轻量级文字处理软件AbiWord 如果你觉得OpenOffice.org的Writer功能过于强大,日常文字处理用不到这么多功能,且希望点击启动器就能快速打开软件,那么AbiWord是个不错的选择。它的界面简洁易用,即使没有太多帮助,你也能轻松上手。 特点…

张小明 2025/12/31 4:03:43 网站建设

企业网站托管方式孝感网站的建设

深入 Remoting:Dubbo 的“搬运工” —— 网络通信与线程模型 请关注公众号【碳硅化合物AI】 摘要 如果说 RPC 是 Dubbo 的大脑,那么 Remoting 就是 Dubbo 的四肢。它负责把 RPC 层生成的调用请求(Invocation)变成二进制流&…

张小明 2025/12/31 3:46:34 网站建设

自己做网站需要学什么东西免费做网站的网站

Nagios 安装与功能拓展全解析 Nagios 是一款强大的网络监控工具,下面将详细介绍其操作理论、安装步骤以及相关的补丁应用。 操作理论 性能数据包装器 以下是一个为所有插件添加性能数据功能的包装器脚本: #!/bin/sh #a wrapper which adds perfdata functionality to a…

张小明 2025/12/31 3:46:30 网站建设

大型网站制作报价小程序制作流程视频

Linly-Talker与360智脑大模型:构建下一代交互式数字人 在电商直播间里,一个面容亲切的虚拟主播正用带有地方口音的普通话介绍新品,声音和表情自然得仿佛真人;政务大厅的智能导办屏前,一位“数字公务员”微笑着为市民解…

张小明 2026/2/27 18:28:38 网站建设