C # Управление формой с использованием другого потока, также не допускайте дублирования форм - PullRequest
1 голос
/ 12 мая 2011

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

просто большинство используемых словв кодировании для меня это ново.мне очень нужны ваши советы, ребята .. = (

к моей проблеме ..

у меня есть 2 формы в моем проекте. form1 действует как мой экран входа в систему, а form2 открывается, еслилогин пользователя правильный

я использую UDP в качестве сокета моего соединения. Я сделал простой UDPlistener внутри таймера ( причина в том, что если я не закрою его, если нечего читать, он просто сделает мойпрограмма зависает и продолжает ожидать сообщения )

Примечание: мой прослушиватель UDP запускается в другом потоке, например

Thread thread1 = new Thread(UDPListener.StartListener);
thread1.SetApartmentState(ApartmentState.STA);
Thread.Sleep(100);
thread1.TrySetApartmentState(ApartmentState.STA);

thread1.Start();

, когда серверная программа отправляет мне сообщениесигнал к открытию form2 проблема теперь возникает ..

проблема в том, что .. form2 обнаружился .. но form1 не скрывается или visible = false; ( form1 должна быть в состоянии сделать это)

я делаю этот код, когда я пытаюсь показать form2 и скрыть form1 Примечание: также другая проблема (не совсем уверенная) .. я заметил, что она просто дублирует формы

Form1 f1 = new Form1();
Form2 f2 = new Form2();
f1.Command("009");
f1.MiniTicker.Enabled = false; //need to do this, cant do this without putting Form1 f1 = new Form1();
Login.TBOption.showTaskBar();
TaskbarHide.Taskbar.Hide();
f1.CoreAds.Enabled = false; //same here

f1.Visible = false;
f1.Hide();

f1.Invoke(
(MethodInvoker)(() =>
{
new TimerMode().Show();
}));


f1.Invoke(
(MethodInvoker)(() =>
{
new MainForm().Hide();
}));

Итоговое примечание: после запуска кода выше ...Это как закрытие, но после этого оно снова открывается ...

Пожалуйста, помогите мне решить мою проблему.мне нужно закончить мой дипломный проект = (

1 Ответ

0 голосов
/ 12 мая 2011

Я собираюсь предположить, что вторая партия кода выполняется в потоке, который вы создали в первой партии. Если это так, то большинство ваших проблем возникает из-за доступа к элементам пользовательского интерфейса из рабочего потока. Позвольте мне сделать это совершенно ясно. Единственное, что вы можете сделать с Form или Control из рабочего потока, это вызвать Invoke или BeginInvoke. Вот и все. Вы абсолютно ничего не можете сделать.

  • Вы не можете вызвать конструктор Form.
  • Вы не можете установить свойство Form.Visible.
  • Вы не можете позвонить Form.Hide.
  • Вы не можете получить доступ к чему-либо , относящемуся к Form.

Это стоит повторить. За исключением методов ISynchronizeInvoke, вы ничего не можете использовать для ссылки Form из рабочего потока. Если вы попытаетесь получить доступ к любому элементу пользовательского интерфейса из потока, отличного от основного потока пользовательского интерфейса, то ваше приложение завершится сбоем; иногда непредсказуемо, а иногда эффектно.

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