[Mono-list] Opening a form on a new thread, called from C API

valdiorn valdiorn at gmail.com
Mon May 2 22:16:05 EDT 2011

Hi. I'm trying to develop a C console program that can open a Mono Form when
I type in the command "open".

in main() I do something like this:

	gets (p);

	// do some work, irrelevant to this question...

	if( strcmp(p, "open") == 0)
		mono_runtime_invoke (dialog, NULL, NULL, NULL);

dialog is the MonoMethod I want to run. It's defined in a C# dll assembly
that I have already loaded.

Now, the dialog function is simply :

public static void dialog()
	Form f = new Form();

This works pretty well. The form opens, but it runs on the same thread as
the main program, so the console freezes while the GUI is open. I want to
start a new thread and run dialog() from there.

I modify my C code to:

if( strcmp(p, "open") == 0)
		mono_runtime_invoke (startThread, NULL, NULL, NULL);

where startThread is another monoMethod. It is this method (in the loaded C#

public static void startThread()
	Thread t = new Thread(new ThreadStart(dialog));

Now the form starts on a new thread, and I can even open several forms if I
want (by typing "open" repeatedly at the prompt. I want this behavior, so
it's all good).

Everything is fine until I close ALL the forms and then try to launch a new
form again. When I do this the program crashes, giving me this error: 

Unhandled Exception: System.OutOfMemoryException: Not enough memory to
complete operation [GDI+ status: OutOfMemory]
  at System.Drawing.GDIPlus.CheckStatus (Status status) [0x00000] in
<filename unknown>:0
  at System.Drawing.Graphics.FromHwnd (IntPtr hwnd) [0x00000] in <filename
  at System.Windows.Forms.XplatUIWin32.GetAutoScaleSize (System.Drawing.Font
font) [0x00000] in <filename unknown>:0
  at System.Windows.Forms.XplatUI.GetAutoScaleSize (System.Drawing.Font
font) [0x00000] in <filename unknown>:0
  at System.Windows.Forms.Form.GetAutoScaleSize (System.Drawing.Font font)
[0x00000] in <filename unknown>:0
  at System.Windows.Forms.Form..ctor () [0x00000] in <filename unknown>:0
  at (wrapper remoting-invoke-with-check) System.Windows.Forms.Form:.ctor ()
  at testApp.Program.dialog () [0x00000] in <filename unknown>:0
  at System.Threading.Thread.StartUnsafe () [0x00000] in <filename

I can't understand why this happens. and remember, it only happens after I
close ALL the forms I had previously opened, and then try to open an new one
after that. As long as I leave at least one form open on the screen, it
doesn't crash.

I previously posted this question on stackOverflow. For full code see:


I did not get any answers there. hopefully you can help! :)

View this message in context: http://mono.1490590.n4.nabble.com/Opening-a-form-on-a-new-thread-called-from-C-API-tp3491548p3491548.html
Sent from the Mono - General mailing list archive at Nabble.com.

More information about the Mono-list mailing list