Получение нескольких потоков пользовательского интерфейса в Windows Forms - PullRequest
4 голосов
/ 20 сентября 2008

Я пытаюсь найти способ заставить пользовательские элементы управления работать в своих собственных потоках пользовательского интерфейса. Это возможно? Я пытаюсь предотвратить сбой приложения на основе модуля из-за одного модуля.

Есть мысли?

Ответы [ 4 ]

1 голос
/ 20 сентября 2008

К сожалению, все элементы управления пользовательского интерфейса работают в одном потоке пользовательского интерфейса. Поэтому любой код, работающий в этом потоке, который потенциально может привести к ситуации зависания, должен быть закодирован с помощью некоторой логики тайм-аута.

DateTime startTime = DateTime.Now;
while(DateTime.Now.Subtract(startTime).TotalSeconds < 30)
{
     //do something
}

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

1 голос
/ 20 сентября 2008

Это невозможно. Однако, с некоторым нетривиальным кодом, вы можете иметь разные окна, работающие в отдельных потоках. Каждое окно будет иметь свой собственный цикл сообщений.

Обновление:

Еще один способ, которым вы можете придумать, - это написать свои элементы управления особым образом. Вы можете обрабатывать все события в ваших элементах управления, создав новый поток, который будет выполнять всю логику.

0 голосов
/ 11 мая 2012

Запуск управления в разных потоках должен быть возможен. Немного взлома и окон переопределяет, и это должно быть выполнимо.

Я думаю, что вы можете создать элемент управления с графическим интерфейсом в другом потоке, а затем переместить его в общее окно (основной поток с графическим интерфейсом) с помощью Win api SetParent. SetParent может использоваться для «взлома» других окон, поэтому вы должны иметь возможность захватывать элементы управления таким образом. Но, конечно, могут быть проблемы с фокусом и другие проблемы, но это может быть выполнимо.

Я использовал это один раз, чтобы поместить свою кнопку в MS Messenger.

0 голосов
/ 20 сентября 2008

Полагаю, дело не в сбое программы. Конечно, могут быть обнаружены исключения, но проблема заключается в зависании элементов управления. Ради этой ситуации, вот пример:

public void Button1_Click(object sender, EventArgs args)
{
     while(true) {}
}

Если бы этот код запускался в элементе управления, исключение не выдавалось бы, но зависало Я пытаюсь определить способ поймать это и удалить модуль управления из приложения.

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