// 精武堂比武 void CMy3GQQDlg::OnFight() {// 精武堂比武// toggle fight state atomically m_FightState = !m_FightState.load();bool fightOn = m_FightState.load();if (!fightOn) {// 如果是以终止线程的方式来结束的比武,那么程序控制不允许再次比武if (m_JingWuTangStop.load()) {AfxMessageBox(L"目前已经比过武了,重新开始请重启此程序。");return;}GetDlgItem(IDC_BUTTON25)->EnableWindow(TRUE); // 开始比武之后,启用终止线程按钮。 }else{PTP_WORK work = CreateThreadpoolWork(ThreadPoolFun{auto pDlg = reinterpret_cast<CMy3GQQDlg*>(param);static bool st = true; // 控制当前线程在进程运行期间只执行一次。如果按钮是第二次点击,并且终止线程的按钮已点击/自动结束,直接return返回。if (!st && pDlg->m_JingWuTangStop.load()) {::PostMessage(pDlg->m_hWnd, WM_APP + 5, IDC_BUTTON2, AllocThreadMsg(L"开始比武"));pDlg->MessageBox(L"目前已经比过武了,重新开始请重启此程序2。",0,MB_ICONEXCLAMATION);::PostMessage(pDlg->m_hWnd, WM_APP + 1, IDC_BUTTON25, FALSE);return;}st = false;::PostMessage(pDlg->m_hWnd, WM_APP + 1, IDC_BUTTON25, TRUE);::PostMessage(pDlg->m_hWnd, USER_THREAD_MESSAGE, AllocThreadMsg(_T("正在启动精武堂比武!,请留意页面打开情况。。")), 0);::PostMessage(pDlg->m_hWnd, WM_APP + 5, IDC_BUTTON2, AllocThreadMsg(L"停止比武"));for (auto id : pDlg->m_JingWuTang) {static bool s = true, m = false;// wait while pausedwhile (!pDlg->m_FightState.load()) {if (s == true) {::PostMessage(pDlg->m_hWnd, USER_THREAD_MESSAGE, AllocThreadMsg(_T("精武堂比武已暂停!")), 0);::PostMessage(pDlg->m_hWnd, WM_APP + 5, IDC_BUTTON2, AllocThreadMsg(L"开始比武"));s = false;m = true;}Sleep(100);}s = true;if (m == true) {::PostMessage(pDlg->m_hWnd, USER_THREAD_MESSAGE, AllocThreadMsg(_T("精武堂比武已恢复!")), 0);::PostMessage(pDlg->m_hWnd, WM_APP + 5, IDC_BUTTON2, AllocThreadMsg(L"停止比武"));m = false;}CString str;str.Format(_T("https://3gqq.cn/game/arena/contest/%d.html"), id);::ShellExecuteW(nullptr, L"open", str, nullptr, nullptr, SW_SHOWNORMAL);Sleep(pDlg->m_Timeout);// stop early if requestedif (pDlg->m_JingWuTangStop.load()) break;}::PostMessage(pDlg->m_hWnd, USER_THREAD_MESSAGE, AllocThreadMsg(_T("精武堂比武已结束!")), 0);::PostMessage(pDlg->m_hWnd, WM_APP + 5, IDC_BUTTON2, AllocThreadMsg(L"开始比武"));pDlg->m_JingWuTangStop = true;}, this, &env);if (!work) {MessageBox(L"创建work失败!");return;}SubmitThreadpoolWork(work);works.push_back(work);} }
