2009-03-03 3 views
1

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

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

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

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

+1

Звучит как действительно классный проект. – configurator

ответ

2

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

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

+0

Хотя Application.DoEvent() не имеет ничего общего с потоковой обработкой. – erikkallen

+0

Я никогда не говорил, что это было :) –

+0

Он не может вызвать Application.DoEvents() из своей внешней C++ dll, правда? Я думаю, что простая резьба - это ответ. – configurator

1

Попробуйте System.Threading как сказал Марк, также поищите на фоне Рабочий процесс, который немного проще в VB.NET. Чтение here

0

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

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

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

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

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

Если это не работает, просто Google «C++» Темы

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

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

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

+0

Это похоже на хороший вариант. Как бы я продолжал постоянно работать на C++ в фоновом режиме? Я пытался использовать do до цикла в VB, чтобы сократить время простоя до минимума, но это кажется лучшим вариантом. – user71498

1

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

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

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

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

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

Смежные вопросы