Тема: Таймер и ожидание выполнения LISP-команд
Доброго всем времени суток!
Вопрос у меня достаточно короткий.
Как добиться последовательного выполнения команд?
Есть такой код:
// ----- ads_startMyCmd symbol (do not rename) static int ads_startMyCmd(void) { //----- Remove the following line if you do not expect any argument for this ADS function struct resbuf *pArgs =acedGetArgs () ; // TODO: add your code here acedGetAcadFrame()->SetTimer(10, 3000, TimerProc); // TODO: Replace the following line by your returned value if any acedRetVoid () ; return (RSRSLT) ; } // Timer Proc function... static void CALLBACK EXPORT TimerProc(HWND hWnd,UINT nMsg,UINT nIDEvent,DWORD dwTime) { //acedGetAcadFrame()->KillTimer(10);// and kill the timer... if (curDoc()->isQuiescent()) StartLisp(); } // starten LISP-Routine. static void StartLisp(void) { Acad::ErrorStatus es; es = acDocManager->sendStringToExecute(curDoc(), _T("(load \"c:\\\\Temp\\\\myPrj.VLX\")\n"); if (es != Acad::eOk) MessageBox(acedGetAcadFrame()->m_hWnd, _T(""myPrj.VLX"), _T("myPrj.VLX"),MB_ICONERROR); es = acDocManager->sendStringToExecute(curDoc(), _T("(load \"c:\\\\Temp\\\\myPrj.LSP\")\n"); if (es != Acad::eOk) MessageBox(acedGetAcadFrame()->m_hWnd, _T("myPrj.LSP"), _T("myPrj.LSP"),MB_ICONERROR); es = acDocManager->sendStringToExecute(curDoc(), _T("(myLispFunc \"arg1\")\n"); if (es != Acad::eOk) MessageBox(acedGetAcadFrame()->m_hWnd, _T("myLispFunc"), _T("myLispFunc"),MB_ICONERROR); curDwg = acDocManager->curDocument(); NewDocOpen(); acDocManager->closeDocument(curDwg); } //----------------------------------------- static void newSyncDocHelper( void *pData) { Acad::ErrorStatus es = Acad::eNoDocument; AcApDocument* pDoc = acDocManager->curDocument(); if (acDocManager->isApplicationContext()) es = acDocManager->appContextNewDocument((const TCHAR *)pData); acutPrintf(L"\nМы в новом документе!!!"); acDocManager->activateDocument(pDoc); } static void NewDocOpen(void) { // Add your code for command NewDoc.newdoc here static TCHAR pData[] = _T("L:\\VSS_CADBAT2006\\DWG\\ACADM.DWT"); AcApDocument* pDoc = acDocManager->curDocument(); if (pDoc) acDocManagerPtr()->executeInApplicationContext(newSyncDocHelper, (void *)pData); acutPrintf(L"\nМы в старом документе!!!"); }
В 'myLispFunc' выполняются какие-то действия и чертеж сохраняется.
Таймер повторяет эти действия и т.д.
К сожалению после первого созданного чертежа код выдает ошибку и AutoCAD падает.
Т.е., как я понимаю, таймер продолжает работать, пытается запустить повторно всю процедуру и рушит AutoCAD.
Мне надо каким-то образом дождаться выполнения всего кода, сохранить чертеж, открыть новый и закрыть старый, потом снова запустить таймер или что-то в этом роде.
Подскажите куда копать, если можно с примером.
Надеюсь мой код понятен.
Спасибо.