void DeinitJobSystem() { try { if (g_VDJobQueue.IsModified()) g_VDJobQueue.Flush(); } catch(const MyError&) { // eat flush errors } g_VDJobQueue.Shutdown(); }
void VDUIJobControlDialog::OnDestroy() { HWND hwndItem = GetDlgItem(mhdlg, IDC_JOBS); VDUISaveListViewColumnsW32(hwndItem, "Job control: Columns"); VDUISaveWindowPlacementW32(mhdlg, "Job control"); g_VDJobQueue.SetCallback(NULL); g_hwndJobs = NULL; try { g_VDJobQueue.Flush(); } catch(const MyError&) { // ignore flush error } }
bool VDUIJobControlDialog::OnMenuHit(uint32 id) { static const wchar_t fileFilters[]= L"VirtualDub job list (*.jobs)\0" L"*.jobs\0" L"VirtualDub script (*.syl, *.vdscript)\0" L"*.syl;*.vdscript\0" L"All files (*.*)\0" L"*.*\0"; try { switch(id) { case ID_FILE_LOADJOBLIST: { VDStringW filename(VDGetLoadFileName(kFileDialog_JobList, (VDGUIHandle)mhdlg, L"Load job list", fileFilters, NULL)); if (!filename.empty()) g_VDJobQueue.ListLoad(filename.c_str(), false); } break; case ID_FILE_SAVEJOBLIST: { VDStringW filename(VDGetSaveFileName(kFileDialog_JobList, (VDGUIHandle)mhdlg, L"Save job list", fileFilters, NULL)); if (!filename.empty()) g_VDJobQueue.Flush(filename.c_str()); } break; case ID_FILE_USELOCALJOBQUEUE: if (g_VDJobQueue.IsRunInProgress()) MessageBox(mhdlg, "Cannot switch job queues while a job is in progress.", g_szError, MB_ICONERROR | MB_OK); else g_VDJobQueue.SetJobFilePath(NULL, false, false); break; case ID_FILE_USEREMOTEJOBQUEUE: if (g_VDJobQueue.IsRunInProgress()) MessageBox(mhdlg, "Cannot switch job queues while a job is in progress.", g_szError, MB_ICONERROR | MB_OK); else { const VDFileDialogOption opts[]={ { VDFileDialogOption::kConfirmFile, 0, NULL, 0, 0}, {0} }; int optvals[]={ false }; VDStringW filename(VDGetSaveFileName(kFileDialog_JobList, (VDGUIHandle)mhdlg, L"Use shared job list", fileFilters, NULL, opts, optvals)); if (!filename.empty()) { if (!_wcsicmp(filename.c_str(), g_VDJobQueue.GetDefaultJobFilePath())) { DWORD res = MessageBox(mhdlg, "Using the same job file that is normally used for local job queue operation is not recommended as " "it can cause job queue corruption.\n" "\n" "Are you sure you want to use this file for the remote queue too?", "VirtualDub Warning", MB_ICONEXCLAMATION | MB_YESNO); if (res != IDYES) break; } g_VDJobQueue.SetJobFilePath(filename.c_str(), true, true); } } break; case ID_EDIT_CLEARLIST: if (IDOK != MessageBox(mhdlg, "Really clear job list?", "VirtualDub job system", MB_OKCANCEL | MB_ICONEXCLAMATION)) break; g_VDJobQueue.ListClear(false); break; case ID_EDIT_DELETEDONEJOBS: for(uint32 i=0; i<g_VDJobQueue.ListSize();) { VDJob *vdj = g_VDJobQueue.ListGet(i); if (vdj->GetState() == VDJob::kStateCompleted) { g_VDJobQueue.Delete(vdj, false); delete vdj; } else ++i; } break; case ID_EDIT_FAILEDTOWAITING: g_VDJobQueue.Transform(VDJob::kStateAborted, VDJob::kStateWaiting); g_VDJobQueue.Transform(VDJob::kStateError, VDJob::kStateWaiting); break; case ID_EDIT_WAITINGTOPOSTPONED: g_VDJobQueue.Transform(VDJob::kStateWaiting, VDJob::kStatePostponed); break; case ID_EDIT_POSTPONEDTOWAITING: g_VDJobQueue.Transform(VDJob::kStatePostponed, VDJob::kStateWaiting); break; case ID_EDIT_DONETOWAITING: g_VDJobQueue.Transform(VDJob::kStateCompleted, VDJob::kStateWaiting); break; case ID_EDIT_PROCESSDIRECTORY: JobProcessDirectory(mhdlg); break; case ID_WHENFINISHED_DONOTHING: { VDRegistryAppKey appKey(""); appKey.setBool(g_szRegKeyShutdownWhenFinished, false); } break; case ID_WHENFINISHED_SHUTDOWN: { VDRegistryAppKey appKey(""); appKey.setBool(g_szRegKeyShutdownWhenFinished, true); appKey.setInt(g_szRegKeyShutdownMode, 0); } break; case ID_WHENFINISHED_HIBERNATE: { VDRegistryAppKey appKey(""); appKey.setBool(g_szRegKeyShutdownWhenFinished, true); appKey.setInt(g_szRegKeyShutdownMode, 1); } break; case ID_WHENFINISHED_SLEEP: { VDRegistryAppKey appKey(""); appKey.setBool(g_szRegKeyShutdownWhenFinished, true); appKey.setInt(g_szRegKeyShutdownMode, 2); } break; } } catch(const MyError& e) { e.post(mhdlg, "Job system error"); } return true; }