создаю поток, в него кидаю функцию рисования фигуры, после вызова потока методом Start() фигура почему-то не рисуется, точнее она рисуется и сразу исчезает, кто-то знает почему так ?
twobomb, Win Form, да, вывод идет в Picture Box, я как понял проблема с таймером ,который каждую секунду обновляет PB, "Я попробовал отключить перерисовку в методе таймера(refresher'a) и перерисовка работала только по нажатию на клавишу, в таком случае все работало(фигуры двигались и рисовались по-новой)"
twobomb, по логике программы, фигура должна двигаться(за это отвечает функция Move) и без обновления pictureBox'a (функцией pbMain.Refresh(), которая происходит каждую секунду ) движения нету
1SLY2, Ну и что что двигается, какая разница. Вы просто очищаете и перерисовываете в новой позиции. Ну напрямую лучше не работать с graphics, лучше использовать Invoke. Хотя зачем тут вообще отдельный поток для рисования, я не понимаю.
Пример с инвоком, будем по движению мыши рисовать квадратик рядом с ней, типа перемещение
private Graphics g;
public Form1() {
InitializeComponent();
g = pictureBox1.CreateGraphics();
}
void pictureBox1_MouseMove(object sender, MouseEventArgs e)
{
var p = pictureBox1.PointToClient(MousePosition);
Thread drawThread;
drawThread = new Thread(() =>
{
MethodInvoker methodInvokerDelegate = delegate(){
g.Clear(Color.White);
g.FillRectangle(Brushes.Red, new Rectangle(p.X, p.Y, 10, 10));
};
Invoke(methodInvokerDelegate);
});
drawThread.Start();
}
twobomb, я более менее понял, что вы хотели сказать, но дело в том что в моей задаче проблема в том, что происходит обновление PB, и пропадает сама фигура, обновление PB происходит каждую секунду
1SLY2, Фигура это ваш собственный класс? Потому-что в WinForms помоему нет такого, но есть в WPF. Ну не суть, я не понимаю зачем так вообще нужны обновления, а тем более так редко. Какие там может быть движение, дерганья какие-то.
1SLY2, не знаю что то там странное, не нужны там ни какие обновления, просто чистим и рисуем и всё сразу отображается, что то странное у вас там. Может вы рисуете отдельно в какой-то битмап, а потом этот битмап переприсваиваете в PB.
Возникает сразу вопрос - каким образом Вы рисуете фигуру?
Предварительные причины:
- не соблюдение потокобезопасного обращения к контролу;
- произвольный refresh контрола, на котором производится рисование.
и т.д. и т.п.
1SLY2, refresh контрола Вы отключить без WinAPI не сможете. Да это и не нужно. Раз при перерисовке изображение пропадает, значит что-то Вы делаете не так. Попробуйте рисовать не в отдельном потоке, а в общем потоке программы. Мне всё-таки кажется, да и в приведённом коде видно, что Вы не используете Invoke при обращении к контролу из потока.
BasiC2k, дело в том, что мне нужно рисовать в отдельном потоке, и если можно про инвоук еще чутка рассказать, может он решит проблему. Я попробовал отключить перерисовку в методе таймера(refresher'a) и перерисовка работала только по нажатию на клавишу, в таком случае все работало(фигуры двигались и рисовались по-новой)