Форум АНТИЧАТ

Форум АНТИЧАТ (https://forum.antichat.xyz/index.php)
-   С/С++, C#, Delphi, .NET, Asm (https://forum.antichat.xyz/forumdisplay.php?f=24)
-   -   [help] Потоки и Windows Forms controls (https://forum.antichat.xyz/showthread.php?t=195904)

NetSter 13.04.2010 15:22

[help] Потоки и Windows Forms controls
 
Всем привет.
Не могу въехать в thread-safe and unsafe ways to call a Windows Forms control.
Нужно мне тугому на простом примере показать как это сделать. Для примера возьмем самый примитив. главное понять а дальше уже привинтить что нужно проблем не составит.

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

PHP код:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace 
WindowsFormsApplication1
{
    public 
partial class Form1 Form
    
{
        public 
Form1()
        {
            
InitializeComponent();
        }

        private 
void button1_Click(object senderEventArgs e)
        {
            
textBox1.Text = ("Hello, Antichat!");
        }
    }


либо же вызвать метод

PHP код:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace 
WindowsFormsApplication1
{
    public 
partial class Form1 Form
    
{
        public 
Form1()
        {
            
InitializeComponent();
        }

        private 
void button1_Click(object senderEventArgs e)
        {
            
hello();
        }

        private 
void hello()
        {
            
textBox1.Text = ("Hello, Antichat!");
        }
    }


все это одно и тоже... смысл не в этом.
мне нужно вызвать метод hello отдельным потоком.
но с потоками я почти не знаком, и теперь начинается все самое веселое.
запускаю поток
PHP код:

private void button1_Click(object senderEventArgs e)
        {
            
Thread privet = new Thread(hello);
            
privet.Start();
        }
private 
void hello()
        {
            
textBox1.Text = ("Hello, Antichat!");
        } 

и что имеем...
ОШИБКА Недопустимая операция в нескольких потоках: попытка доступа к элементу управления "textBox1" не из того потока, в котором он был создан.

ну суть ошибки как бы ясна. исправить ее только не получается у меня)
Может кто распишет этот примитив для меня, чтобы разобраться можно было)
задача та же - просто заполнить текстбокс с другоо потока.

NetSter 13.04.2010 15:29

Здесь присутствуют: 10 (пользователей - 1 , гостей - 9)
0_o

Berman 13.04.2010 15:32

синхронизировать нужно
покрайнеё мере в делфи так

W!z@rD 13.04.2010 15:45

if (InvokeRequed)
{
BeginInvoke(new MethodInvoker(() => textBox1.Text = "abc")));
}


P.S. тыц

NetSter 13.04.2010 16:10

thx.
Close pls.
ЗЫ\ не видел ту статью, честно :rolleyes:


Время: 21:08