HLFX.Ru Forum
профиль •  правила •  регистрация •  календарь •  народ •  FAQ •  поиск •  новое •  сутки •  главная •  выход  
HLFX.Ru Forum HLFX.Ru Forum > Наш форум > Технические вопросы > Потоки в C++
Не могу в ООП, классы и проч
  Предыдущая тема   Следующая тема
Автор
Тема Новая тема    Ответить
DEAD MAN
Mono

Группа: Опытный
Дата регистрации: Oct 2005
Проживает: Tallinn
Сообщений: 1232
Возраст: 33

Рейтинг



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 - ничего не понимаю вообще.

Сообщить модератору | | IP: Записан
Сообщение: 129083

Старое сообщение 13-12-2013 18:30
- За что?
Government-Man
Призрак

Дата регистрации: Apr 2006
Проживает: N/A
Сообщений: 3507

Рейтинг



Награды
 
[1 награда]


Если пишешь под дотнет, лучше пользуйся C#

Цитата:
DEAD MAN писал:
AfxBeginThread и Createthread - ничего не понимаю вообще


Эти функции ты используешь, если пишешь обычный системный код на C/C++, без использования дотнета.

Про нет курить тут:
http://msdn.microsoft.com/en-us/lib...=vs.110%29.aspx

Сообщить модератору | | IP: Записан
Сообщение: 129084

Старое сообщение 13-12-2013 18:44
- За что?
 XaeroX
Crystice Softworks

Дата регистрации: Oct 2005
Проживает: Торонто
Сообщений: 34643
Нанёс повреждений: 514 ед.
Возраст: 38

Рейтинг



Награды
 
[1 награда]


DEAD MAN
Как, и ты - программист?

__________________

Сообщить модератору | | IP: Записан
Сообщение: 129085

Старое сообщение 13-12-2013 19:05
-
DEAD MAN
Mono

Группа: Опытный
Дата регистрации: Oct 2005
Проживает: Tallinn
Сообщений: 1232
Возраст: 33

Рейтинг



Government-Man Слишком много переписывать и перечитывать придётся, если переносить на C#. За ссылку спасибо, будем читать.

XaeroX Да если бы. Студент-ленивый я. А программирование, это часть специальности, которая меня убивает.

Сообщить модератору | | IP: Записан
Сообщение: 129086

Старое сообщение 13-12-2013 19:17
- За что?
DEAD MAN
Mono

Группа: Опытный
Дата регистрации: Oct 2005
Проживает: Tallinn
Сообщений: 1232
Возраст: 33

Рейтинг



В общем почитал я по ссылке Government-Man`а и ещё больше запутался. Но наткнулся на такую интересный класс как BackgroundWorker, собственно с ним получилось завести поток, но завершить его не получается. Почему? Потому, что в методе Logics у меня бесконечный цикл, который опрашивает сенсор Кинекта. Собственно поэтому метод CancelAsync() не может завершить поток.
Может кто подскажет, что можно в этом случаи предпринять? Появилась идея вызвать медод CancelAsync(), а затем Logics с аргументом, который завершит цикл, параллельно с работающим потоком, но это мягко говоря идиотизм.

Сообщить модератору | | IP: Записан
Сообщение: 129103

Старое сообщение 14-12-2013 20:24
- За что?
Government-Man
Призрак

Дата регистрации: Apr 2006
Проживает: N/A
Сообщений: 3507

Рейтинг



Награды
 
[1 награда]


DEAD MAN тебе нужно создать новый экземпляр System::Thread, у него есть методы Start() и Abort(), которые запускают и останавливают поток соответственно.

В функции, которая у тебя вызывается в отдельном потоке ты должен поставить обработчик ThreadAbortException, и выполнить освобождение ресурсов если это требуется. В главном потоке после вызова myThread.Abort() также желательно вызвать myThread.Join() чтобы подождать пока он завершится.

Подробнее тут: http://msdn.microsoft.com/en-us/lib...=vs.110%29.aspx

Сообщить модератору | | IP: Записан
Сообщение: 129113

Старое сообщение 15-12-2013 09:07
- За что?
~ X ~
offline

Дата регистрации: Oct 2005
Проживает: Архангельск
Сообщений: 3619

Рейтинг



Награды
 
[1 награда]


А давайте без провокационных названий тредов, а? Это не C++!

__________________
Минутка полезного:
Бесплатный UT-подобный Half-Life mod.
Бесплатный редактор для 32-битных текстур. Без дотнета.
Бесплатный IDE для любых компиляторов и ЯП.
Бесплатная Windows-подобная ОС.
Проверка грамматики русского языка.
Чат по hl[fx]: [email protected]

Сообщить модератору | | IP: Записан
Сообщение: 129118

Старое сообщение 15-12-2013 12:56
- За что?
marikcool
Житель форума

Дата регистрации: Jul 2011
Проживает: kz
Сообщений: 1522
Возраст: 38

Рейтинг



можешь отдельно гуи запилить на чем угодно, а консоль версия пусть send/postmessage шлет гуи окну и все.
а для эстетического вида, если потребуется, просто скрой консоль версию приложения.

__________________
vk.com/skullcapstudios

Сообщить модератору | | IP: Записан
Сообщение: 129132

Старое сообщение 15-12-2013 18:40
- За что?
DEAD MAN
Mono

Группа: Опытный
Дата регистрации: Oct 2005
Проживает: Tallinn
Сообщений: 1232
Возраст: 33

Рейтинг



Government-Man Большое спасибо, частично разобрался. В том числе и через BackgroundWorker, только кривым способом - глобальная переменная.

~ X ~ А давайте без провокационных сообщений, а? Это не помощь. Оригинальный код написан на чистом С++.

marikcool Я думал над этим, но это крайний случай.

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

Сообщить модератору | | IP: Записан
Сообщение: 129150

Старое сообщение 16-12-2013 14:51
- За что?
Тема: (Опционально)
Ваш ответ:



Переводчик транслита


[проверить длину сообщения]
Опции: Автоматическое формирование ссылок: автоматически добавлять [url] и [/url] вокруг интернет адресов.
Уведомление по E-Mail: отправить вам уведомление, если кто-то ответил в тему (только для зарегистрированных пользователей).
Отключить смайлики в сообщении: не преобразовывать текстовые смайлики в картинки.
Показать подпись: добавить вашу подпись в конец сообщения (только зарегистрированные пользователи могут иметь подписи).

Временная зона GMT. Текущее время 01:54. Новая тема    Ответить
  Предыдущая тема   Следующая тема
HLFX.Ru Forum HLFX.Ru Forum > Наш форум > Технические вопросы > Потоки в C++
Не могу в ООП, классы и проч
Версия для печати | Отправить тему по E-Mail | Подписаться на эту тему

Быстрый переход:
Оцените эту тему:

Правила Форума:
Вы not можете создавать новые темы
Вы not можете отвечать в темы
Вы not можете прикреплять вложения
Вы not можете редактировать ваши сообщения
HTML Код ВЫКЛ
vB Код ВКЛ
Смайлики ВКЛ
[IMG] Код ВКЛ
 

< Обратная связь - HLFX.ru >

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