Общий GDI + Ошибка - PullRequest
       13

Общий GDI + Ошибка

0 голосов
/ 02 октября 2008

Форма запускается из другой формы в другом потоке. Большую часть времени это работает отлично, но время от времени я получаю ошибку ниже. Кто-нибудь может помочь?

at System.Drawing.Bitmap..ctor(Int32 width, Int32 height, PixelFormat format)
at System.Drawing.Bitmap..ctor(Int32 width, Int32 height)
at System.Drawing.Icon.ToBitmap()
at System.Windows.Forms.ThreadExceptionDialog..ctor(Exception t)
at System.Windows.Forms.Application.ThreadContext.OnThreadException(Exception t)
at System.Windows.Forms.Control.WndProcException(Exception e)
at System.Windows.Forms.Control.ControlNativeWindow.OnThreadException(Exception e)
at System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)    
at System.Windows.Forms.UnsafeNativeMethods.DispatchMessageW(MSG& msg)
at System.Windows.Forms.Application.ComponentManager.System.Windows.Forms.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop(Int32 dwComponentID, Int32 reason, Int32 pvLoopData)
at System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner(Int32 reason, ApplicationContext context)    
at System.Windows.Forms.Application.ThreadContext.RunMessageLoop(Int32 reason, ApplicationContext context)    
at System.Windows.Forms.Form.ShowDialog(IWin32Window owner)    
at System.Windows.Forms.Form.ShowDialog()

Ответы [ 3 ]

1 голос
/ 06 октября 2008

Пользователь должен видеть несколько открытых аккаунтов одновременно, верно? Итак, вам нужно несколько экземпляров формы?

Если я не читаю что-то неправильно, я не думаю, что вам нужны потоки для этого сценария, и я думаю, что вы просто представляете себя в результате обиды (как эти исключения).

Предполагая, что форма вашей учетной записи называется AccountForm, я бы сделал это вместо:

Dim acctForm As New AccountForm()
acctForm.Show()

(Конечно, у вас будет своя логика для этого ...) Я мог бы даже поместить ее в метод ShowForm, чтобы я мог просто таким образом обновить своего вызывающего:

ShowForm()

И все будет сделано. Теперь все это предполагает, что вы аккуратно инкапсулировали AccountForm, чтобы у каждого экземпляра были свои данные, и они ничего не делили между экземплярами.

Использование потоков для этого не только излишне, но и может привести к ошибкам, таким как исключение вверху. И мой опыт отладки многопоточных приложений WinForms показал, что эти ошибки часто очень трудно воспроизвести, и их чрезвычайно сложно найти и исправить. Часто лучшее решение состоит в том, чтобы не использовать многопоточность, если у вас нет абсолютно положительного .

0 голосов
/ 03 октября 2008

Приложение представляет собой систему управления клиентами типа Explorer. Форма учетной записи запускается из формы «Основной» в отдельном фоновом потоке. Мы делаем это, потому что пользователь должен иметь возможность открывать несколько учетных записей одновременно.

Запускаем форму, используя этот код:

Thread = New Thread(AddressOf ShowForm)
Thread.SetApartmentState(ApartmentState.STA)
Thread.IsBackground = True
0 голосов
/ 02 октября 2008

Можете ли вы уточнить, что вы пытаетесь сделать здесь? Если вы пытаетесь показать форму из потока, отличного от потока пользовательского интерфейса, обратитесь к этому вопросу: Моя форма не отображается должным образом при запуске из другого потока

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...