Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Вопрос по многопоточности

21K
07 августа 2009 года
Revenant
29 / / 25.05.2008
Всем доброго времени суток!

Есть некая процедура с параметром типа Form1(созданная мной форма), выполняющая действия с ее контролом. Вопрос такой: как передать параметр типа Form1 процедуре в поток?

Процедурка (метод класса Card):
Код:
public void insert_listening(Form1 form)
        {
            while(true)
            {
                if (CSL_CardIsInserted() == ErrorCode.Ok)
                {
                    form = new Form1();
                    form.button1.Enabled = true;
                    form.notifyIcon.ShowBalloonTip(1);
                    form.ShowDialog();
                    return;
                }
            }
        }


объявление потока:

Код:
Card card = new Card();
        Thread insert;

        public Form1()
        {
            InitializeComponent();
            readerlist.AddRange(card.GetCardReadersList());
            notifyIcon.ShowBalloonTip(1);
            insert = new Thread(new ParameterizedThreadStart(card.insert_listening));
            insert.Start(this);
        }


В резутьтате линкер говорит что для данного метода нет соответствующей перегрузки для делегата ParameterizedThreadStart.

Это один из испробованных мной вариантов. Я пробоавал по разному. Перерыл мсдн по потокам, не нашел описание именно такого случая.

Как правильно передать параметр процедуре в поток? Может я что не так делаю...

Заранее бллагодарен.
1.9K
07 августа 2009 года
GreenRiver
451 / / 20.07.2008
А если так:
 
Код:
public [COLOR="Red"]static[/COLOR] void insert_listening(Form1 form)
        {
           ...
        }

Код:
Card card = new Card();
        Thread insert;

        public Form1()
        {
            InitializeComponent();
            readerlist.AddRange(card.GetCardReadersList());
            notifyIcon.ShowBalloonTip(1);
            insert = new Thread(Card.insert_listening);
            insert.Start(this);
        }

Здесь хорошо описано. Не боитесь кстати из другого потока обращаться к элементам формы? Глюки будут и они будут поистине непредсказуемыми ... Вам удобнее будет использовать BackGroundWorker
21K
07 августа 2009 года
Revenant
29 / / 25.05.2008
Не успел сказать что решил эту проблему) Но все равно спасибо)

Теперь вопрос другой... Есть еще одна процедурка:

Цитата:

private void remove_listening()
{
while (true)
{
if (card.card_is_inserted() == ErrorCode.CardIsNotInserted)
{
button1.Enabled = false;
fl = true;
return;
}
}
}



Эта и та, что я описал в первом посте, как видно, работают с одними и теми же контролами. Нужно чтобы они чередовались друг с другом.

Закончилась одна выполняться, началась вторая. Закончилась вторая - началась первая. Хочу в два потока их запихнуть, но вот не пойму как их так ссинхронизировать... Может есть варианты? Жду комментариев

1.9K
07 августа 2009 года
GreenRiver
451 / / 20.07.2008
Цитата: Revenant
Не успел сказать что решил эту проблему) Но все равно спасибо)


Осталась одна ещё очень серьезная проблема, которую вы проигнорировали: с формами и контролами можно оперировать только из того потока в котором они были созданы. Иначе последствия могут быть непредсказуемыми. Программа может отлично отработать 100 раз, а на 101 случится какой-нибудь сбой и т.д.

Цитата: Revenant

Эта и та, что я описал в первом посте, как видно, работают с одними и теми же контролами. Нужно чтобы они чередовались друг с другом.

Закончилась одна выполняться, началась вторая. Закончилась вторая - началась первая. Хочу в два потока их запихнуть, но вот не пойму как их так ссинхронизировать... Может есть варианты? Жду комментариев


Варианты всегда есть... Вопрос в том зачем вам два потока, если они поочередно выполняются? Так и напишите их в теле цикла поочереди...

1.9K
07 августа 2009 года
GreenRiver
451 / / 20.07.2008
Кстати зачем вообще здесь потоки? Если я правильно понял, в потоке проверяется какое-то свойство на ошибку?
Во-первых, у вас на это будет тратиться все процессорное время - поставьте хоть sleep(100) что ли...
Во-вторых, здесь вообще поток не нужен... Простого таймера было бы достаточно.
21K
10 августа 2009 года
Revenant
29 / / 25.05.2008
Благодарю за помощь и советы.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог