示例#1
0
        /// <summary>
        /// Запуск формы в другом потоке
        /// </summary>
        /// <param name="hFinishedSearchEvent">
        /// Событие, установка которого закрывает окно
        /// </param>
        /// <param name="th">
        /// Поток, в котором создаётся окно
        /// </param>
        /// <param name="WndTitle"></param>
        /// <param name="WndText"></param>
        public static int ShowAsync(out AutoResetEvent hFinishedSearchEvent, out Thread th, string WndTitle, string WndText, Window OwnerWindow)
        {
            hFinishedSearchEvent = new AutoResetEvent(false);
            th = new Thread(ShowAsyncThreadFunc)
            {
                IsBackground = true
            };

            if (m_csShowCounter.Value > 0)
            {
                return(0);
            }

            m_csShowCounter++;

            CShowAsyncParam ThreadParam = new CShowAsyncParam()
            {
                m_ID = NextWndID,
                m_hFinishedSearchEvent = hFinishedSearchEvent,
                m_WndTitle             = WndTitle,
                m_WndText     = WndText,
                m_OwnerWindow = OwnerWindow
            };

            th.SetApartmentState(ApartmentState.STA);
            th.Start(ThreadParam);

            GlobalDefines.DoEvents(DBManagerApp.MainWnd); // Чтобы не зависла главная форма и в её заголовке не было написано "(Не отвечает)"

            return(NextWndID++);
        }
示例#2
0
        /// <summary>
        /// Функция потока.
        /// Отдельная функция сделана для того, чтобы в неё можно было передать "out AutoResetEvent hFinishedSearchEvent"
        /// </summary>
        /// <param name="Parameter"></param>
        private static void ShowAsyncThreadFunc(object Parameter)
        {
            CShowAsyncParam ThreadParam = Parameter as CShowAsyncParam;
            CWaitingWnd     wnd         = new CWaitingWnd(ThreadParam.m_ID,
                                                          ThreadParam.m_hFinishedSearchEvent,
                                                          ThreadParam.m_OwnerWindow,
                                                          ThreadParam.m_WndText,
                                                          ThreadParam.m_WndTitle,
                                                          300);

            try
            {
                m_dictAllWnds.TryAddValue(ThreadParam.m_ID, wnd);
                wnd.ShowDialog();
            }
            catch (Exception ex)
            {
                DumpMaker.HandleExceptionAndClose(ex, AppAttributes.Title);
            }
        }