Модераторы: Partizan, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> не работает Clipboard с другого потока. и опять потоки 
V
    Опции темы
Bladerender
Дата 24.6.2009, 22:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 207
Регистрация: 19.7.2007

Репутация: нет
Всего: нет



Доброго времени суток, Вингралюди. Есть такая проблема.  Не работает клипборд в другом Треде. Исключений никаких нет. Просто там пусто. Предварительно я методом CTRL+C копирую из файлика строчку. Нажимаю CTRL+V - данные есть. А Clipboard.GetText() говорит, что там пусто. 
Понятно что тут дело с потоками, и что текущий поток должен выполняется в режиме апартмента с одним потоком (STA). 
STAThreadAttribute в метод Main добавлял. Так же добавлял этот атрибут везде где только давало добавить. Не работает и все. Уверен что можно сделать как-то через делегаты, но что-то не могу вкурить как. Помогите плиз.

Код

private void button1_Click(object sender, EventArgs e)
        {
           ClipboardHelper hepler = new ClipboardHelper();
            Thread newThread = new Thread(new ThreadStart(hepler.Method));
            newThread.Start();

        }
}

public class ClipboardHelper
{
        public void Method()
        {
            string s = Clipboard.GetText();
            MessageBox.Show(s);
        }
}


PM MAIL   Вверх
Bladerender
Дата 25.6.2009, 13:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 207
Регистрация: 19.7.2007

Репутация: нет
Всего: нет



Так тоже не конает.

Код

public partial class Form1 : Form
{
        public delegate void SetDataDelegate();[/B]

private void button1_Click(object sender, EventArgs e)
        {
           ClipboardHelper hepler = new ClipboardHelper();
            Thread newThread = new Thread(new ThreadStart(hepler.Method));
            newThread.Start();

        }
}

public class ClipboardHelper
  {
[STAThread]
        public void Method()
        {
            string s = FromClipboard();
            MessageBox.Show(s);
        }

        public string FromClipboard()
        {

            string s = String.Empty;

            Form1.SetDataDelegate sedDatadelegate = delegate()
            {
                if (Clipboard.ContainsText())
                {
                    s = Clipboard.GetText();
                }
            };

            sedDatadelegate.Invoke();
            Thread.Sleep(100);
            return s;
        }
}


Это сообщение отредактировал(а) Bladerender - 25.6.2009, 13:16
PM MAIL   Вверх
Partizan
Дата 25.6.2009, 13:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Let's do some .NET
****


Профиль
Группа: Модератор
Сообщений: 2828
Регистрация: 19.12.2005
Где: Санкт-Петербург

Репутация: 18
Всего: 67



Цитата(Bladerender @ 25.6.2009,  13:07)
Так тоже не конает.

Код

public partial class Form1 : Form
{
        public delegate void SetDataDelegate();[/B]

private void button1_Click(object sender, EventArgs e)
        {
           ClipboardHelper hepler = new ClipboardHelper();
            Thread newThread = new Thread(new ThreadStart(hepler.Method));
            newThread.Start();

        }
}

public class ClipboardHelper
  {
[STAThread]
        public void Method()
        {
            string s = FromClipboard();
            MessageBox.Show(s);
        }

        public string FromClipboard()
        {

            string s = String.Empty;

            Form1.SetDataDelegate sedDatadelegate = delegate()
            {
                if (Clipboard.ContainsText())
                {
                    s = Clipboard.GetText();
                }
            };

            sedDatadelegate.Invoke();
            Thread.Sleep(100);
            return s;
        }
}

а зачем в этом примере вообще участует helper?


--------------------
СУВ,
       Partizan.
PM MAIL WWW ICQ Skype GTalk Jabber   Вверх
Bladerender
Дата 25.6.2009, 13:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 207
Регистрация: 19.7.2007

Репутация: нет
Всего: нет



А затем, что я запускаю как тред как раз метод класса ClipboardHepler. И в этом методе мне нужно доступатся до Clipboard

Это сообщение отредактировал(а) Bladerender - 25.6.2009, 13:46
PM MAIL   Вверх
Partizan
Дата 25.6.2009, 14:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Let's do some .NET
****


Профиль
Группа: Модератор
Сообщений: 2828
Регистрация: 19.12.2005
Где: Санкт-Петербург

Репутация: 18
Всего: 67



Bladerender, сорри...не заметил, что Method объявлен в классе Helper...


--------------------
СУВ,
       Partizan.
PM MAIL WWW ICQ Skype GTalk Jabber   Вверх
Partizan
Дата 25.6.2009, 15:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Let's do some .NET
****


Профиль
Группа: Модератор
Сообщений: 2828
Регистрация: 19.12.2005
Где: Санкт-Петербург

Репутация: 18
Всего: 67



Цитата

Понятно что тут дело с потоками, и что текущий поток должен выполняется в режиме апартмента с одним потоком (STA). 


Перед стартом потока вызывайте SetApartmentState(ApartmentState.STA);


--------------------
СУВ,
       Partizan.
PM MAIL WWW ICQ Skype GTalk Jabber   Вверх
Bladerender
Дата 25.6.2009, 15:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 207
Регистрация: 19.7.2007

Репутация: нет
Всего: нет



Работает!!!. Видно сразу было додуматся не судьба, как правильно синхронизировать эти потоки.


Код


namespace xxx
{

public delegate void MyDelegate();

{

public string s;

        private void button1_Click(object sender, EventArgs e)
        {
            ClipboardHelper hepler = new ClipboardHelper(GetText,this);
            Thread newThread = new Thread(new ThreadStart(hepler.Method));

            if(Clipboard.ContainsText())
                MessageBox.Show(Clipboard.GetText());

            newThread.Start();
        }

        public void GetText()
        {
            s = Clipboard.GetText();
        }
}


 public class ClipboardHelper
    {
        public ClipboardHelper(MyDelegate del, Form1 form)
        {
            _del = del;
            _form = form;
        }

        private MyDelegate _del;
        private Form1 _form1;

        public void Method()
        {
            _form1.Invoke(_del); // вот в этой строчке все щастье :)))))
            string s = Form1.s;
            MessageBox.Show(s);
        }
            
    }


PS:2Partizan Спасибо, вечером попробую и Ваш способ, а то мой как-то длинновато получилось. Но все таки мне кажеться, что этот режим STA будет тормозить работу приложения. Попробуем.

Это сообщение отредактировал(а) Bladerender - 25.6.2009, 16:10
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема »


 




[ Время генерации скрипта: 0.0483 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.