Лучший способ многопоточности - PullRequest
1 голос
/ 03 марта 2009

У меня скоро должно быть задание колледжа, и мне нужно иметь возможность вызывать dll C ++, для выполнения которой требуется много времени (возможно, infinte, это зависит от ввода пользователя). Я звоню через VB. Мой VB GUI зависает, когда это происходит, и я хотел бы, чтобы GUI реагировал так, чтобы пользователь мог остановить этот цикл возможного заражения.

Кто-нибудь может предложить лучший / быстрый способ сделать это?

Немного предыстории: C ++ пытается вести счет на снукерной таблице с помощью веб-камеры, и хотя табло VB легко обновляется, я хотел бы написать его так, чтобы анализ был почти непрерывным, но при этом позволял пользователю взаимодействовать. В настоящее время проект требует, чтобы пользователь нажал кнопку, чтобы начать анализ снимков, но было бы предпочтительнее, если бы программа сама создавала сценарии. Я только понял эту проблему сейчас, и крайний срок очень скоро.

Обновление: наш лектор предложил вариант решения проблемы, но, похоже, большинство вариантов здесь и предложенных им не будут работать для нас, поскольку время обработки, требуемое для захвата изображения с веб-камеры, слишком велико из-за аппаратные ограничения. Спасибо, что нашли время помочь, это очень ценилось!

Ответы [ 5 ]

2 голосов
/ 03 марта 2009

Лучший способ обработки потоков в VB.NET - через пространство имен System.Threading .

Вы также можете посмотреть Application.DoEvents ()

1 голос
/ 05 марта 2009

Я бы определенно использовал процесс Background Worker. Вы можете перетащить его на форму и использовать подпрограмму DoWork, чтобы фактически выполнить работу, которая замораживает ваш поток графического интерфейса. Вы также можете использовать событие ReportProgress для фактического отображения прогресса в вашей форме.

Что касается вашего вопроса о двух отдельных потоках, если выполнение обоих шагов занимает много времени, я запускаю их в одном и том же потоке один за другим.

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

Действительно хорошим ресурсом о том, как реализовать этот код наряду с работой с многопоточностью, является PDF .

Я также должен отметить, что, если вы используете .net 1.0 / 1.1, вы все равно можете выполнять многопоточность, но у вас нет возможности управлять рабочим фоном. Вам просто нужно создать новый поток из пространства имен System.Threading.

1 голос
/ 03 марта 2009

Попробуйте систему. Считая, как сказал Марк, также попробуйте посмотреть на Background Worker Process, который немного проще в VB.NET. Чтение здесь

0 голосов
/ 05 марта 2009

Я удивлен, что никто еще не предложил использовать BackgroundWorker.

0 голосов
/ 03 марта 2009

Так же, как альтернатива, ваш C ++ может постоянно обрабатываться в фоновом режиме. При вызове из VB он будет просто извлекать из него данные или посылать ему команду (start, quit, ???), все из которых будут возвращаться мгновенно.

Это также может повысить надежность, так как C ++ никогда не пропустит видеокадры, пока VB собирает мусор, моет посуду или делает все, что VB делает в фоновом режиме - C ++ позволит вам быть ближе к системе реального времени.

RE: комментарий о том, как.

Что бы я, вероятно, сделал, это чтобы мои VB-программы отправляли «Сообщения» на C ++ (как я уже сказал). Сообщение - это просто способ думать о вызове функции / метода, но обычно они быстро возвращаются.

В сообщении «Пуск» будет сказано, что код C ++ должен запустить поток и вернуться к нему. Это нить Linux C ++ howto , я не уверен, если вам нужно сделать что-то другое в Windows (надеюсь, нет, но я не использовал C ++ в качестве основного языка разработки в течение десятилетий ).

Если это не сработает, просто Google "Потоки C ++"

Отправка сообщения «Стоп» остановит поток (и, вероятно, освободит ресурсы).

Вызов «Get Data» будет направлен в то место, которое поток C ++ использовал для хранения данных, захватит его и вернет.

Извините, что так общепринят, в наши дни я довольно сильно Java.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...