Не знал куда запостить, поэтому решил в эту ветку.
В общем есть у меня небольшая консольная программа, которая шлёт некоторые данные с Microsoft Kinect в COM порт, да вот незадача - заставили всё это дело с GUI сделать и тут посыпалось сотни проблем. Пишу в MS Visual Studio 2010, тип проекта CLR Windows Forms Application.
В общем есть некая форма Form1.h содержащая:
C++ Source Code:
1
#include"KinectLogic.h"
2
#pragma once
3
4
namespace KinectCraneGui {
5
//namespaces
6
public ref class Form1 : public System::Windows::Forms::Form
Как сделать так, что бы метод Logics запускался в отдельном потоке и завершался, если dataVector[2] будет равен 0? Гуглил документацию для AfxBeginThread и Createthread - ничего не понимаю вообще.
В общем почитал я по ссылке Government-Man`а и ещё больше запутался. Но наткнулся на такую интересный класс как BackgroundWorker, собственно с ним получилось завести поток, но завершить его не получается. Почему? Потому, что в методе Logics у меня бесконечный цикл, который опрашивает сенсор Кинекта. Собственно поэтому метод CancelAsync() не может завершить поток.
Может кто подскажет, что можно в этом случаи предпринять? Появилась идея вызвать медод CancelAsync(), а затем Logics с аргументом, который завершит цикл, параллельно с работающим потоком, но это мягко говоря идиотизм.
DEAD MAN тебе нужно создать новый экземпляр System::Thread, у него есть методы Start() и Abort(), которые запускают и останавливают поток соответственно.
В функции, которая у тебя вызывается в отдельном потоке ты должен поставить обработчик ThreadAbortException, и выполнить освобождение ресурсов если это требуется. В главном потоке после вызова myThread.Abort() также желательно вызвать myThread.Join() чтобы подождать пока он завершится.
можешь отдельно гуи запилить на чем угодно, а консоль версия пусть send/postmessage шлет гуи окну и все.
а для эстетического вида, если потребуется, просто скрой консоль версию приложения.