HLFX.Ru Forum (https://hlfx.ru/forum/index.php)
- Технические вопросы (https://hlfx.ru/forum/forumdisplay.php?forumid=20)
-- Потоки в C++ (https://hlfx.ru/forum/showthread.php?threadid=4201)
Отправлено DEAD MAN 13-12-2013 в 18:30:
Потоки в C++
Не знал куда запостить, поэтому решил в эту ветку.
В общем есть у меня небольшая консольная программа, которая шлёт некоторые данные с Microsoft Kinect в COM порт, да вот незадача - заставили всё это дело с GUI сделать и тут посыпалось сотни проблем. Пишу в MS Visual Studio 2010, тип проекта CLR Windows Forms Application.
В общем есть некая форма Form1.h содержащая:
C++ Source Code:
1 | #include "KinectLogic.h" |
4 | namespace KinectCraneGui { |
6 | public ref class Form1 : public System::Windows::Forms::Form |
10 | private: kinectclass::KinectLogic Kinect; |
11 | private: System::Void btnStart_Click(System::Object^ sender, System::EventArgs^ e) |
15 | dataVector[0] = this->cbxHand->SelectedIndex; |
16 | dataVector[1] = this->cbxCOM->SelectedIndex; |
21 | Kinect.Logics(dataVector); |
И есть очень кривой класс в KinectLogic.h:
C++ Source Code:
3 | #include <NuiSkeleton.h> |
12 | public ref class KinectLogic |
15 | int Logics(int dataVector[]) |
17 | bool bHand = dataVector[0]; |
18 | int iIndex = dataVector[1]; |
19 | bool bSkeletonTracking = dataVector[2]; |
Как сделать так, что бы метод Logics запускался в отдельном потоке и завершался, если dataVector[2] будет равен 0? Гуглил документацию для AfxBeginThread и Createthread - ничего не понимаю вообще.
Отправлено Government-Man 13-12-2013 в 18:44:
Если пишешь под дотнет, лучше пользуйся C# 
Цитата:
DEAD MAN писал:
AfxBeginThread и Createthread - ничего не понимаю вообще
Эти функции ты используешь, если пишешь обычный системный код на C/C++, без использования дотнета.
Про нет курить тут:
http://msdn.microsoft.com/en-us/lib...=vs.110%29.aspx
Отправлено XaeroX 13-12-2013 в 19:05:
DEAD MAN
Как, и ты - программист? 
__________________
Отправлено DEAD MAN 13-12-2013 в 19:17:
Government-Man Слишком много переписывать и перечитывать придётся, если переносить на C#. За ссылку спасибо, будем читать.
XaeroX Да если бы.
Студент-ленивый я. А программирование, это часть специальности, которая меня убивает.
Отправлено DEAD MAN 14-12-2013 в 20:24:
В общем почитал я по ссылке Government-Man`а и ещё больше запутался. Но наткнулся на такую интересный класс как BackgroundWorker, собственно с ним получилось завести поток, но завершить его не получается. Почему? Потому, что в методе Logics у меня бесконечный цикл, который опрашивает сенсор Кинекта. Собственно поэтому метод CancelAsync() не может завершить поток.
Может кто подскажет, что можно в этом случаи предпринять? Появилась идея вызвать медод CancelAsync(), а затем Logics с аргументом, который завершит цикл, параллельно с работающим потоком, но это мягко говоря идиотизм. 
Отправлено Government-Man 15-12-2013 в 09:07:
DEAD MAN тебе нужно создать новый экземпляр System::Thread, у него есть методы Start() и Abort(), которые запускают и останавливают поток соответственно.
В функции, которая у тебя вызывается в отдельном потоке ты должен поставить обработчик ThreadAbortException, и выполнить освобождение ресурсов если это требуется. В главном потоке после вызова myThread.Abort() также желательно вызвать myThread.Join() чтобы подождать пока он завершится.
Подробнее тут: http://msdn.microsoft.com/en-us/lib...=vs.110%29.aspx
Отправлено ~ X ~ 15-12-2013 в 12:56:
А давайте без провокационных названий тредов, а? Это не C++!
__________________
Минутка полезного:
Бесплатный UT-подобный Half-Life mod.
Бесплатный редактор для 32-битных текстур. Без дотнета.
Бесплатный IDE для любых компиляторов и ЯП.
Бесплатная Windows-подобная ОС.
Проверка грамматики русского языка.
Чат по hl[fx]: [email protected]
Отправлено marikcool 15-12-2013 в 18:40:
можешь отдельно гуи запилить на чем угодно, а консоль версия пусть send/postmessage шлет гуи окну и все.
а для эстетического вида, если потребуется, просто скрой консоль версию приложения.
__________________
vk.com/skullcapstudios
Отправлено DEAD MAN 16-12-2013 в 14:51:
Government-Man Большое спасибо, частично разобрался.
В том числе и через BackgroundWorker, только кривым способом - глобальная переменная.
~ X ~ А давайте без провокационных сообщений, а? Это не помощь. Оригинальный код написан на чистом С++.
marikcool Я думал над этим, но это крайний случай.
В общем всем спасибо, пока проблем больше нет.