Using Virtual Window
Using virtual window for mulithreading applications.
Table of Contents
Overview
You know that we can post or send a message to other windows which may run in another thread under MiniGUI-Threads. The MiniGUI messaging functions such as PostMessage()
, SendMessage()
, SendNotifyMessage()
, and the window callback procedure provide a flexible, efficient, safe, and flexible data transfer and synchronization mechanism for your multithreaded applications.
For example, you can send or post a message to a window from a general purpose thread which may download a file from a remote server under MiniGUI-Threads.
But can we use the MiniGUI messaging mechanism under MiniGUI-Processes and MiniGUI-Standalone runtime modes for multithreading purpose? For example, we may download a file in a general thread and inform a window when the file is ready.
Furthermore, if we want to use the MiniGUI messaging mechanism in a general thread to handle messages from other threads, how to do this?
The virtual window provides a solution for the requirements above. A virtual window is a special window object which does not have a visible window area. But after you create a virtual window in a different thread, you can use the MiniGUI messaging mechanism to post or send messages between the current main window thread and the new thread.
In MiniGUI, we call a thread creating a main window as a GUI thread, and a thread creating a virtual window as a message thread.
It is important to know the following key points about virtual window:
It is enabled automatically under MiniGUI-Threads runtime mode.
It can be enabled by using the compile-time configuration option
--enable-virtualwindow
, or define_MGHAVE_VIRTUAL_WINDOW
macro under MiniGUI-Processes and MiniGUI-Standalone runtime modes.You can create multiple GUI threads under MiniGUI-Threads, but you cannot create multiple GUI threads under MiniGUI-Processes and MiniGUI-Standalone runtime modes. In other words, there is only one GUI thread (the main thread) under MiniGUI-Processes and MiniGUI-Standalone runtime modes.
Regardless of the runtime mode, you can create multiple message threads, and you can also create multiple virtual windows in one message thread.
It is possible to create a virtual window in a GUI thread, although we do not encourage to do this.
Essentially, a virtual window is a simplified main window. It consumes very little memory space, but provides a complete MiniGUI messaging mechanism for a general multithreaded app.
When virtual window is enabled (or under MiniGUI-Threads runtime mode), you can use the MiniGUI messaging facilities to post or send messages to a window, or notify a window from a general thread.
A virtual window will get the following system messages in its life life-cycle:
MSG_CREATE
: this message will be sent to the virtual window when you call \aCreateVirtualWindow
function.MSG_CLOSE
: this message will be sent to the virtual window when the system asks to close the virtual window.MSG_DESTROY
: this message will be sent to the virtual window when the system tries to destroy the virtual window, or after you called \aDestroyVirtualWindow
function.MSG_IDLE
: When there is no any message in the message queue, all virtual windows living in the message thread will get this idle message.MSG_TIMER
: When a timer expired after you callSetTimer
to set up a timer for a virtual window.MSG_QUIT
: quit the message loop.MSG_GETTEXT
: To query the caption of the virtual window.MSG_SETTEXT
: To set the caption of the virtual window.MSG_GETTEXTLENGTH
: To query the caption length of the virtual window.MSG_FDEVENT
: Send to the window procedure when there is a read/write/except event on a listened file descriptor.
You can call DefaultVirtualWinProc
in your window procedure for a virtual window for the default handling of the messages above.
A virtual window has the following properties:
The additional data and the additional data 2.
The identifier in a LINT value.
The notification callback procedure.
The caption.
The local data.
Therefore, the following APIs can be called for a virtual window:
DefaultWindowProc
GetWindowId
SetWindowId
GetThreadByWindow
GetWindowAdditionalData
SetWindowAdditionalData
GetWindowAdditionalData2
SetWindowAdditionalData2
GetClassName
: always returnsVIRTWINDOW
for a virtual window.GetWindowCallbackProc
SetWindowCallbackProc
GetWindowCaption
SetWindowCaption
GetWindowTextLength
GetWindowText
SetWindowText
GetNotificationCallback
SetNotificationCallback
SetWindowLocalData
GetWindowLocalData
RemoveWindowLocalData
RegisterEventHookWindow
UnregisterEventHookWindow
RegisterKeyHookWindow
RegisterMouseHookWindow
RegisterListenFD
UnregisterListenFD
Like a main window, when you want to create a virtual window, you call CreateVirtualWindow
, and when you wan to destroy a virtual window, you call DestroyVirtualWindow
. You must call VirtualWindowCleanup
to cleanup the system resource used by the virtual window after done with it, e.g., after quitting the message loop.
Last updated