HLFX.Ru Forum
Показать все 9 сообщений этой темы на одной странице

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:

Question Потоки в C++

Не знал куда запостить, поэтому решил в эту ветку.

В общем есть у меня небольшая консольная программа, которая шлёт некоторые данные с 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
7
  {
8
    //gui stuff
9
 
10
    private: kinectclass::KinectLogic Kinect;
11
    private: System::Void btnStart_Click(System::Object^  sender, System::EventArgs^  e)
12
    {
13
      int dataVector[3];
14
 
15
      dataVector[0] = this->cbxHand->SelectedIndex;
16
      dataVector[1] = this->cbxCOM->SelectedIndex;
17
      dataVector[2] = 1;
18
 
19
      //gui stuff
20
 
21
      Kinect.Logics(dataVector);
22
    }
23
  };
24
}


И есть очень кривой класс в KinectLogic.h:
C++ Source Code:
1
#include <windows.h>
2
#include <NuiApi.h>
3
#include <NuiSkeleton.h>
4
#include <stdio.h>
5
 
6
#pragma once
7
using namespace System;
8
using namespace std;
9
 
10
namespace kinectclass
11
{
12
  public ref class KinectLogic
13
  {
14
  public:
15
    int Logics(int dataVector[])
16
    {
17
      bool bHand = dataVector[0];
18
      int iIndex = dataVector[1];
19
      bool bSkeletonTracking = dataVector[2];
20
      //method stuff
21
      return 0;
22
    }
23
  };
24
}


Как сделать так, что бы метод 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
Как, и ты - программист?

__________________

xaerox on Vivino


Отправлено 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 Я думал над этим, но это крайний случай.

В общем всем спасибо, пока проблем больше нет.


Временная зона GMT. Текущее время 01:22.
Показать все 9 сообщений этой темы на одной странице

На основе vBulletin версии 2.3.0
Авторское право © Jelsoft Enterprises Limited 2000 - 2002.
Дизайн и программирование: Crystice Softworks © 2005 - 2024