Вопрос по многопоточности
Есть некая процедура с параметром типа Form1(созданная мной форма), выполняющая действия с ее контролом. Вопрос такой: как передать параметр типа Form1 процедуре в поток?
Процедурка (метод класса Card):
{
while(true)
{
if (CSL_CardIsInserted() == ErrorCode.Ok)
{
form = new Form1();
form.button1.Enabled = true;
form.notifyIcon.ShowBalloonTip(1);
form.ShowDialog();
return;
}
}
}
объявление потока:
Thread insert;
public Form1()
{
InitializeComponent();
readerlist.AddRange(card.GetCardReadersList());
notifyIcon.ShowBalloonTip(1);
insert = new Thread(new ParameterizedThreadStart(card.insert_listening));
insert.Start(this);
}
В резутьтате линкер говорит что для данного метода нет соответствующей перегрузки для делегата ParameterizedThreadStart.
Это один из испробованных мной вариантов. Я пробоавал по разному. Перерыл мсдн по потокам, не нашел описание именно такого случая.
Как правильно передать параметр процедуре в поток? Может я что не так делаю...
Заранее бллагодарен.
{
...
}
Thread insert;
public Form1()
{
InitializeComponent();
readerlist.AddRange(card.GetCardReadersList());
notifyIcon.ShowBalloonTip(1);
insert = new Thread(Card.insert_listening);
insert.Start(this);
}
Здесь хорошо описано. Не боитесь кстати из другого потока обращаться к элементам формы? Глюки будут и они будут поистине непредсказуемыми ... Вам удобнее будет использовать BackGroundWorker
Теперь вопрос другой... Есть еще одна процедурка:
private void remove_listening()
{
while (true)
{
if (card.card_is_inserted() == ErrorCode.CardIsNotInserted)
{
button1.Enabled = false;
fl = true;
return;
}
}
}
Эта и та, что я описал в первом посте, как видно, работают с одними и теми же контролами. Нужно чтобы они чередовались друг с другом.
Закончилась одна выполняться, началась вторая. Закончилась вторая - началась первая. Хочу в два потока их запихнуть, но вот не пойму как их так ссинхронизировать... Может есть варианты? Жду комментариев
Осталась одна ещё очень серьезная проблема, которую вы проигнорировали: с формами и контролами можно оперировать только из того потока в котором они были созданы. Иначе последствия могут быть непредсказуемыми. Программа может отлично отработать 100 раз, а на 101 случится какой-нибудь сбой и т.д.
Эта и та, что я описал в первом посте, как видно, работают с одними и теми же контролами. Нужно чтобы они чередовались друг с другом.
Закончилась одна выполняться, началась вторая. Закончилась вторая - началась первая. Хочу в два потока их запихнуть, но вот не пойму как их так ссинхронизировать... Может есть варианты? Жду комментариев
Варианты всегда есть... Вопрос в том зачем вам два потока, если они поочередно выполняются? Так и напишите их в теле цикла поочереди...
Во-первых, у вас на это будет тратиться все процессорное время - поставьте хоть sleep(100) что ли...
Во-вторых, здесь вообще поток не нужен... Простого таймера было бы достаточно.