создаю ФУНКЦИЮ, в которой надо изменить :
StopButton.Enabled = true;
пишет ошибку:
Недопустимая операция в нескольких потоках: попытка доступа к элементу управления "StopButton" не из того потока, в котором он был создан.
что не так??? не правильно дал доступ???
ставлю на кнопке Modifiers = Public такая же ситуация…
подскажите что не так?
П.С. заранее спасибо.
8 ноября 2009 в 14:02
Ну вот меняю чекед у чекбокса например.
namespace WindowsFormsApplication1
{
public partial class Form1 : Form
{
private Thread t;
public Form1()
{
InitializeComponent();
t = new Thread(() => {
while (true)
{
if (InvokeRequired)
{
Invoke(new MethodInvoker(this.toggleCB));
}
else
{
toggleCB();
}
Thread.Sleep(500);
}
});
t.Start();
}
void toggleCB()
{
this.checkBox1.Checked = !this.checkBox1.Checked;
}
private void Form1_FormClosed(object sender, FormClosedEventArgs e)
{
t.Abort();
}
}
}
8 ноября 2009 в 14:00
Николай Митропольский
а можешь написать пример с Invoke, как например в кнопке button1 изменить значение Enabled в какой-нибудь функции?
8 ноября 2009 в 13:05
Да ладно тебе! Кривокод рулит! ))
8 ноября 2009 в 13:04
Invoke – более правильный метод. Ибо ГУИ должны обрабатываться одним потоком.
8 ноября 2009 в 13:03
ооо) пасиб))) заработало всё… без Invoke
8 ноября 2009 в 13:01
>> тоесть? лазить в настройках самой кнопки?
Попробуй в конструкторе сразу же после InitializeComponent(); добавить строчку CheckForIllegalCrossThreadCalls = false;
8 ноября 2009 в 12:05
Bogdan ♪♪♪ Микушев
тоесть? лазить в настройках самой кнопки?
8 ноября 2009 в 12:04
>> что не так??? не правильно дал доступ???
Всё правильно, в Visual Studio 2003 данный пример будет работать нормально, а в Visual Studio 2005 не будет из-за некоторых нововведений. Раньше сталкивался с этой проблемой, как её решил – не помню, чтение msdn мне помогло.
8 ноября 2009 в 1:05
Ну фишка в том, что нефига изменять UI из не UI-шного потока.
А вообще гуглите или MSDN-те на тему:
InvokeRequired
и
Invoke