Как можно остановить бесконечный процесс рисования фигур в клиентской области по команде меню, к примеру?
Просто бесконечный цикл – идея нехорошая, тк прога ни на что кроме него реагировать не собирается.. Посоветуйте, пожалуйста, как можно этого избежать
28 марта 2009 в 1:00
почитай книгу Компьютерная графика, мультимедиа и игры на Visual C# 2005. Жарков там есть про Graphics довольно много.
27 марта 2009 в 22:02
Надо по таймеру вызывать перерисовку экрана.
По нажатию одного пункта меню запускать этот таймер, другого – останавливать.
И никаких потоков, бесконечных циклов и чего-то более сложного не надо.
ЗЫ Да, и rand желательно хранить в переменной.
27 марта 2009 в 21:00
Чет чую все эти DoEvents & ProcessMessages будут отставать от действий пользователя и эффект "торможения" все-таки немного будет. Свои вариант предложить не могу.
27 марта 2009 в 10:04
можно было тупо запихать в цикл DoEvents()
не то чтобы сильно элегантно, но в данном случае работать будет вполне. а с потоками надо делать синхронизацию
27 марта 2009 в 10:01
Вот потому и "поток – хреновая идея"…. Как вариант: отрисовывать изображение в памяти, а в основном потоке периодически скидывать на форму. (Не забывая про блокировки)
26 марта 2009 в 23:00
VCL – однопоточная библиотека.
26 марта 2009 в 22:05
хм. Тогда ещё один вопрос: как правильно получать в потоке контекст отображения Graphics?
Graphics g = Graphics.FromHwnd(this.Handle);
"попытка доступа к элементу "Form1" не из того потока, в котором он был создан"
26 марта 2009 в 22:00
а с ним не нужно разбираться, его мощно просто в цикл вставить:) Только он довольно сильно будет его замедлять, поэтому можно вызывать его скажем раз в 1000 циклов
26 марта 2009 в 21:01
C потоками всё удалось =) Спасибо ) Как-нибудь разберусь в Process Messages ))
26 марта 2009 в 20:03
System.Threading.Thread
26 марта 2009 в 20:02
о как… ну да…. прога зависнет и кнопочку ты нажать, естесственно, не сможешь… ну как вариант(если скорость сильной роли не играет) то можнно цикл в таймер затолкать… поставить 1 мс интервал. и включать и выключать его…
26 марта 2009 в 20:02
опередил)) читаешь мысли))
26 марта 2009 в 20:02
)))
26 марта 2009 в 20:02
Ну тут или действительно поток (threads погугли) или в BCB есть функция ProcessMessages (там, кажись, простенький вызов APIшных ф-ций), которая позволяет обработать очередь сообщений (выбор пункта меню).
PS(подумав)… хотя….. поток – хреновая идея, ProcessMessages рулит
26 марта 2009 в 20:01
На самом примитивном уровне:
public bool flag=false;
private void risovanieToolStripMenuItem_Click(object sender, EventArgs e)
{
flag = true;
Graphics g = Graphics.FromHwnd(this.Handle);
int x, y,razmer,r,gr,b;
Random rand = new Random();
for (;;)
{
razmer = rand.Next(0, 500);
x = rand.Next(0, this.Width-razmer/2);
y = rand.Next(0, this.Height+razmer/2);
r = rand.Next(0, 255);
gr = rand.Next(0, 255);
b = rand.Next(0, 255);
System.Threading.Thread.Sleep(50);
g.FillEllipse(new SolidBrush(Color.FromArgb(255, r, gr, b)), x, y, razmer, razmer);
if (flag == false) break;
}
}
private void stopToolStripMenuItem_Click(object sender, EventArgs e)
{
flag = false;
}
26 марта 2009 в 20:01
Может, что-нибудь хитрое с таймером сделать?
26 марта 2009 в 20:00
Андрей [Sn0Xx] Щипцов, боюсь, что нет. if (flag == false) break; – не работает, так как до изменения переменной flag дело не доходит
26 марта 2009 в 20:00
эмм… а выложи цикл что ль…
26 марта 2009 в 19:05
Может можно создать поток и в нем этот цикл крутить?
26 марта 2009 в 19:05
может я что – то не догоняю, а команда break не подойдет?…
26 марта 2009 в 19:05
Хмм)) А где можно про поток прочитать? А то в C# совсем недавно =(