License delivery maintenance is planned for Saturday, July 26, between 12:00 and 20:00 CEST. During this time, you may experience outages or limited availability across our services, including BIMcloud SaaS, License Delivery, Graphisoft ID (for customer and company management), Graphisoft Store, and BIMx Web Viewer. More details…
2006-06-20
03:09 PM
- last edited on
2023-08-07
11:13 AM
by
Doreena Deng
{ bool abort = false; CTestWindow window(abort); //modeless window with access to "abort" for (int i = 0; (i < 10) && !abort; i++) { Sleep(500); PRINT(GET(i)); } }
2006-06-20 06:32 PM
2006-06-20 09:33 PM
Akos wrote:
Try to use a palette instead. Modeless dialogs are special to ArchiCAD.
class CTest3Window { public: CTest3Window(); //creates a pallette with "DGCreateBlankPalette" ~CTest3Window(); void live(); //invokes "DGGetMousePosition" static short int DGCALLBACK mainEventHandler( short message, short dialId, short itemId, long userData, long msgData ); private: short mDialogId; };
CTest3Window::CTest3Window() { mDialogId = DGCreateBlankPalette ( 200, // hSize, 200, // vSize, DG_DLG_NOGROW, // growFlag, DG_DLG_CLOSE, // closeFlag, 0, // captionFlag, DG_DLG_NORMALFRAME, // frameFlag, this->mainEventHandler,// dCallBack, 0 //userData ); DGShowModelessDialog(mDialogId); DGBeginProcessEvents(mDialogId); DGSetModelessDialogStatus(mDialogId, DG_DS_ENABLED); } CTest3Window::~CTest3Window() { DGEndProcessEvents(mDialogId); DGDestroyModelessDialog(mDialogId); } void CTest3Window::live() { DGMousePosData mpd; short mouseStatus = DGGetMousePosition(mDialogId, &mpd); }
To make the loop breakable try calling something like DGGetMousePosition inside the loop; that lets other event handlers run.
for (int i = 0; (i < 10) && !abort; i++) { window.live(); //invokes "DGGetMousePosition" Sleep(500); }
The example you are referring to is the test application for the Dialog Manager (a.k.a DG) module.
2006-06-22 05:35 PM
John wrote:
The process-window which could be created with "ACAPI_Interface(APIIo_InitProcessWindowID,.." does not seem to work properly.
bool abort = false; short nPhase = 1; long maxval = 100; ACAPI_Interface (APIIo_InitProcessWindowID, "incremental search", &nPhase); ACAPI_Interface (APIIo_SetNextProcessPhaseID, "working...", &maxval); for (int i = 0; (i < maxval) && !abort; i++) { Sleep(500); PRINT(GET(i)); ACAPI_Interface(APIIo_SetProcessValueID, &i, NULL); if (ACAPI_Interface(APIIo_IsProcessCanceledID, NULL, NULL)) { abort = true; } } ACAPI_Interface (APIIo_CloseProcessWindowID, NULL, NULL);
2006-06-24 10:14 AM
John wrote:John,
Now, I am using "APIIo_InitProcessWindowID" after all...
It takes a long time before the process-window appears.
So if the process does not takes long enough you don't see this window. Thats why i thought it would not work.
John wrote:The crux of the problem is that much of ArchiCAD has not been designed to support threading. That's why it crashes when a separate thread attempts to access the database.
[Threads]
An other way i tried was the following:
I coded a Status-Window which is able to invoke the method whose status is to be monitored in a new thread.
But there were several problems:
1. The thread I used is not OS-independent and I think you should avoid OS-specific code in AC-Addons.
2. ArchiCAD often crashes, if the method running in the thread is selecting elements or changing the AC-database.