С Новым годом! Форум программистов, компьютерный форум, киберфорум
Visual C++
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.88/25: Рейтинг темы: голосов - 25, средняя оценка - 4.88
 Аватар для abit
868 / 527 / 148
Регистрация: 03.02.2013
Сообщений: 1,845

Поток в классе

05.04.2013, 22:23. Показов 4599. Ответов 13
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
платформа (.NET, VC++ 2008 Express)
такой вопрос:
есть класс, допустим myclass, есть функция для потока, которую необходимо завести в класс (чтобы она была в его области видимости), но не была бы функцией-членом (т.к. компилятор ругается что если она функция-член, то невозможно преобразовать overloaded function)... ок, допустим myfunc она static-функция, просто передадим ей указатель на объект в аргумент, с которым она будет работать...

ввожу её в класс как
static void __cdecl myfunc (...)

реализация допустим такая:
C++
1
static void __cdecl myclass::myfunc(myclass * myobj) {myobj->mymethod();}
в классе есть конструктор
C++
1
2
3
4
myclass()
{
   _begintread((void (__cdecl *)(void *))myfunc, 0, this)
}
почему это падает? перелистал много инфы, не понял как это реализовать, чем отличается скажем от

C++
1
2
3
4
5
6
 static void __cdecl myclass::myfunc(void * myobj) {(myclass*)myobj.mymethod();}
...
myclass()
{
_begintread(myfunc,0,this)
}
как заставить это работать? конечная цель - запускать отдельный поток, который бы мог работать со всеми методами (private) для каждого объекта класса
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
05.04.2013, 22:23
Ответы с готовыми решениями:

Поток std::thread с шаблоном в классе
Доброго времени суток уважаемые! Уперся лбом в следующую проблему. При использовании параллельных потоков в основном потоке проблем...

Не закрывается поток созданный в другом классе
Здравствуйте, подскажите пожалуйста как грамотно отключать поток из form,. у меня даже после закрытия формы потоки продолжают слать смски ...

Как получить доступ к контролу через отдельный поток в кастомном классе?
Ошибка: Невозможно получить доступ к нестатическому члену внешнего типа "Хурда.Form1" через вложенный тип...

13
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
06.04.2013, 11:49
Имхо, не хорошо запускать поток из конструктора, передавая потоку по сути еще не сконструированный объект. Лучше сделать метод start()
0
Автор FAQ
 Аватар для -=ЮрА=-
6614 / 4256 / 401
Регистрация: 08.08.2009
Сообщений: 10,325
Записей в блоге: 24
07.04.2013, 10:06
Цитата Сообщение от abit Посмотреть сообщение
платформа (.NET, VC++ 2008 Express)
- экспреска распараллеливание не умеет, ставь стандарт или full версию. На счёт кода - лови
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
#include <windows.h>
#include <process.h>
 
 
class CParallel
{
private:
    char szMsg[256];
    void ThreadFunc(PVOID pParam);
public :
    CParallel();
    bool SetStr(const char * szStr);
    static void ThreadCall(PVOID pParam)
    {
        CParallel * pThis = (CParallel *)pParam;
        pThis->ThreadFunc(pThis->szMsg);
    }
};
 
CParallel::CParallel()
{
    ZeroMemory(szMsg, 256*sizeof(char));
}
 
bool CParallel::SetStr(const char * szStr)
{
    bool bRet = false;
    if(szStr)
    if(strncpy(szMsg, szStr, 256))
        bRet = true;
    return bRet;
}
 
void CParallel::ThreadFunc(PVOID pParam)
{
    MessageBox(GetForegroundWindow(), (char *)pParam, ";)", MB_OK);
}
 
int main()
{
    CParallel pParallel;
    if(pParallel.SetStr("Êóðè êîä íà çäîðîâüå"))
        _beginthread(pParallel.ThreadCall, 0, &pParallel);
    system("pause");
    return 0;
}
Миниатюры
Поток в классе  
2
 Аватар для abit
868 / 527 / 148
Регистрация: 03.02.2013
Сообщений: 1,845
09.04.2013, 22:18  [ТС]
Цитата Сообщение от Tulosba Посмотреть сообщение
Имхо, не хорошо запускать поток из конструктора, передавая потоку по сути еще не сконструированный объект. Лучше сделать метод start()
не понимаю что вам тут не нравится, это обычное явление
например TObject.Free работает аналогично, он вызывает метод у несозданного объекта

-=ЮрА=-
Вам спасибо, слегка подталкнули на идею!
экспреска распараллеливание не умеет
это у вас на потолке написано? где пруф? расскажите это майкрософту, а то они не знают... у них есть скажем в дефолтной установку Visulal C++ Express компонент "BackgroundWorker", который создаёт поток, собственно благодаря ему я сделал временно решение, которое меня не совсем устраивает


На счёт кода - лови
за подобный код меня конечно не уволят... но на планёрке обсудят мою профпригодность, конструкции типа
char szMsg[256];
if(strncpy(szMsg, szStr, 256))
bRet = true;
return bRet;
это даже не .NET - а даже не C++

в итоге я пока нашёл временный вариант и он работает в VS C++ 2010 Express, благодаря описанному выше компоненту, но он меня не устаревает немного (тем что я не придумал как сделать единственную функцию процесса для всех потоков), но, публикую решение... т.к. недельные поиски по msdn и гуглу не к чему не привели, а встретил только массу вопросов от других, кто бьётся над той же проблемой с ошибкой преобразования
(void (__cdecl *)(void *) от VC++

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include "stdafx.h"
 
public ref class myclass
{
    System::ComponentModel::BackgroundWorker^  bac;
 
    void mymethod(System::Object^  sender, System::ComponentModel::DoWorkEventArgs^  e)
    {
        while(true) 
                      { 
                               Тело процесса
                      }
    }
 
public :
        myclass()
                {
         this->bac = (gcnew System::ComponentModel::BackgroundWorker());
         this->bac->DoWork += gcnew System::ComponentModel::DoWorkEventHandler(this, &myclass::mymethod);
                }
    void start()
        {
         this->bac->RunWorkerAsync();
        }
};
это болванка, но она полностью рабочая... для теста создал 5 объектов этого класса - и для каждого запустился свой процесс
0
Автор FAQ
 Аватар для -=ЮрА=-
6614 / 4256 / 401
Регистрация: 08.08.2009
Сообщений: 10,325
Записей в блоге: 24
09.04.2013, 22:24

Не по теме:

Не умеет потому как экспреска имеет обрезанный функционал (нет кучи lib-ов хедеров и dll), что тут ещё думать..?
Мой код видел?Он пошёл у тебя на экспресе?Сделай выводы тогда сам...



Добавлено через 3 минуты

Не по теме:

PS: А вобще, вчитавшись, я вижу ты профи, куда уж мне нубу со своими примерами...:D

0
09.04.2013, 22:39  [ТС]

Не по теме:


Цитата Сообщение от -=ЮрА=- Посмотреть сообщение

Не по теме:

Не умеет потому как экспреска имеет обрезанный функционал (нет кучи lib-ов хедеров и dll), что тут ещё думать..?
Мой код видел?Он пошёл у тебя на экспресе?Сделай выводы тогда сам...



Добавлено через 3 минуты

Не по теме:

PS: А вобще, вчитавшись, я вижу ты профи, куда уж мне нубу со своими примерами...:D


1) да код не пошёл, я делал аналогично... и через _beginthread и через _beginthreadex и через CreatThread, возился с подключением boost::thread
делал преобразование сигнатур и в процессе и в main потоке - ноль эффекта, всё падало, вероятно есть какое-то ограничение в Express, но говорить, что там это невозможно - тоже поспешно... там же есть компонент, буквально первый или второй для создания потока! я без шуток и сказал Вам спасибо, хотя и обижен несколько по другим моментам) но Ваша фраза меня подтолкнула на решение )

2) я далеко не профи, а в VS точно - новичок ) я всё в Linux+Qt/Gtk вожусь

0
Автор FAQ
 Аватар для -=ЮрА=-
6614 / 4256 / 401
Регистрация: 08.08.2009
Сообщений: 10,325
Записей в блоге: 24
09.04.2013, 22:51
Цитата Сообщение от abit Посмотреть сообщение
но говорить, что там это невозможно - тоже поспешно... там же есть компонент, буквально первый или второй для создания потока!
- фух я привёл код распарраллеливания на плюсах шарп и почти тождественный ему CLI/C++ даже и в мыслях не было трогать.
В твоём первом посте что идёт
Цитата Сообщение от abit Посмотреть сообщение
ввожу её в класс как
static void __cdecl myfunc (...)
- этот каким то боком к шарпу или кли относится?Разочарую НЕТ совершенно! Поставь себе профешинал сборку для начала а потом уже будет пища для обсуждений.
Надо шарп - го ту мелкософт мсдн
http://msdn.microsoft.com/ru-r... orker.aspx

Добавлено через 37 секунд

Не по теме:

Цитата Сообщение от abit Посмотреть сообщение
2) я далеко не профи, а в VS точно - новичок ) я всё в Linux+Qt/Gtk вожусь
- ну а я далеко не нуб

0
 Аватар для abit
868 / 527 / 148
Регистрация: 03.02.2013
Сообщений: 1,845
09.04.2013, 23:00  [ТС]
Поставь себе профешинал сборку для начала а потом уже будет пища для обсуждений.
Дорогая штука, у меня стока свободных денег нет, а директор мне просто так не купит, надо аргументировать

этот каким то боком к шарпу или кли относится?
а вообще-то относится...
дело в том, что мы находимся в теме Visual C++, так, не в шарпе? ок?
далее... в самом стандарте C++ не стандартизированны потоки вообще, они вошли только в 0x11 в std::thread из boost::thread, так? понятно что Visual Studio 2010 явно не знает про 0x11

вопрос был как замутить поток - сходу в глаза бросились Си-шные _beginthread/_begintreadex - падает, следом WinAPI-шный CreatThread - тот же результат

ну так мой код
C
1
static void __cdecl myfunc (...)
это чисто сишный стандарт, что в этом такого, если нет в VS C++ 2010 стандартизированного потока?
0
Автор FAQ
 Аватар для -=ЮрА=-
6614 / 4256 / 401
Регистрация: 08.08.2009
Сообщений: 10,325
Записей в блоге: 24
09.04.2013, 23:16
Цитата Сообщение от abit Посмотреть сообщение
дело в том, что мы находимся в теме Visual C++, так, не в шарпе? ок?
- когда ты выбираешь CLI/C++ это 99,9% шарп и 0,1 С++, посмотри на форуме даже разделы как идут
.NET (онлайн: 309)
C# .NET C# для начинающих
C# Windows Forms C# и базы данных, ADO.NET
C# под Web, ASP.NET C# под Web, ASP.NET MVC
C#: WPF и Silverlight C#: Веб-сервисы и WCF
Visual Basic .NET F# .NET
C++/CLI C++/CLI Windows Forms
LINQ Microsoft XNA
Visual Studio Mono
Как думаешь почему кли идёт с визуал бэйсиком нет шарпом, аспом и моно?И почему есть такой себе раздел С++. Поставь себе 6-ую версию визуал студио (правда она только под 32-х машины), либо посвежей но не новую, уверен на 2005 -ую профешинал лицензия компеечная уже. Мой код идёт от 6-й до 11-й версий студии (конечно же стандарт и про), так что если поставишь 2005-ую ничего в коде менять не надо будет

Добавлено через 8 минут

Не по теме:

PS:abit,

Цитата Сообщение от abit Посмотреть сообщение
а вообще-то относится...
дело в том, что мы находимся в теме Visual C++, так, не в шарпе? ок?
далее... в самом стандарте C++ не стандартизированны потоки вообще, они вошли только в 0x11 в std::thread из boost::thread, так? понятно что Visual Studio 2010 явно не знает про 0x11
- поменьше вдумывайся в бусты мусты С11+ сриды и прочую лабудень, которыли придумала горстка программеров чтобы показться умными, т.к умеют натыкать кучу раскрытий видимости и протеворечивых операндов аля ^:D. Я как представитель старой школы (не боевых а программерских искусств) скажу, что парарллелилось как я показал ещё в далёком 1999 году, когда ХРюша только рынок завоёвывала. Кроме ActiveX я вообще не вижу смысла плодить нетовские ипостаси в бэйсике, КЛИ/С++ и прочем изврате на мой взгляд. Все новомодные штуки можно сесть и спаять в далёкой MSVS 6.0 а ни сидеть думать над каким то извратом от мелкософта (в виде бакграундработника), который лет через 5 забудут, в то время как искусство (не кунгфу а програмерства)останется;)

0
 Аватар для abit
868 / 527 / 148
Регистрация: 03.02.2013
Сообщений: 1,845
09.04.2013, 23:22  [ТС]
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
- когда ты выбираешь CLI/C++ это 99,9% шарп и 0,1 С++, посмотри на форуме даже разделы как идут
Как думаешь почему кли идёт с визуал бэйсиком нет шарпом, аспом и моно?И почему есть такой себе раздел С++. Поставь себе 6-ую версию визуал студио (правда она только под 32-х машины), либо посвежей но не новую, уверен на 2005 -ую профешинал лицензия компеечная уже. Мой код идёт от 6-й до 11-й версий студии (конечно же стандарт и про), так что если поставишь 2005-ую ничего в коде менять не надо будет
представления не имею
я описал вопрос в теме Visual C++, аккуратно выбрал тему

это уже промах модераторов
на форме есть разделы С#.NET - https://www.cyberforum.ru/csharp-net/
есть - C++/CLI - https://www.cyberforum.ru/cpp-cli/

мой вопрос стоял только к Visual C++ Expess, это наиболее близкая тема к моему вопросу

собственно если вы погуглите - вряд ли найдёте решение, этой проблемы, что меня мучила, только больше вопросов встретите как это решить, даже на американских форумах... а я вам дал решение, не жалко )

поменьше вдумывайся в бусты мусты С11+ сриды и прочую лабудень, которыли придумала горстка программеров чтобы показться умными,
Жесть) Ваш уровень мне понятен
вместо std::string s юзать char s[10000]
0
Автор FAQ
 Аватар для -=ЮрА=-
6614 / 4256 / 401
Регистрация: 08.08.2009
Сообщений: 10,325
Записей в блоге: 24
09.04.2013, 23:28
abit, если ты перестанешь страдать болезню "я не хочу никого слушать" и хоть немного послушаешь взрослого дядю умеющего создавать RemoteThread а не обычные потоки, то возьмёшь скачаешь 2005-ую студию и перестанешь упорствовать что да как. Я привёл код именно того что тебе надо, чтобы его слинковать надо стандарт эдишн, если таковой нет то о каком росте к профи может идти речь?! Всё я реально начинаю злиться, лучше трезво всё перечитай, а я пока займусь делами.
0
 Аватар для abit
868 / 527 / 148
Регистрация: 03.02.2013
Сообщений: 1,845
09.04.2013, 23:42  [ТС]
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
abit, если ты перестанешь страдать болезню "я не хочу никого слушать" и хоть немного послушаешь взрослого дядю умеющего создавать RemoteThread а не обычные потоки, то возьмёшь скачаешь 2005-ую студию и перестанешь упорствовать что да как. Я привёл код именно того что тебе надо, чтобы его слинковать надо стандарт эдишн, если таковой нет то о каком росте к профи может идти речь?! Всё я реально начинаю злиться, лучше трезво всё перечитай, а я пока займусь делами.
1) твой код не работает в том, что я просил - VS C++ 2010 Express, крякнутым софтом я пользоваться не буду, упорство тут не причём, я работаю над оборонными заказами РФ, и мой код контролируется кучей органов
2) мне это код вообще не нужен, он не корректен и на ананлоге ALTERA Cyclon II я забью дофига драгоценной памяти хотя бы твоей строкой char szMsg[256]; - там каждый бит на счету
3) я повторяю, что благодарен тебе и даже поставил плюс за твоё сообщение, просто потому что оно подтолкнуло меня на мысль

хватит тема закрыта, до решения я допёр и даже опубликовал болванку как запустить поток в VS C++ 2010 Express, которую кстати нигде больше не встретите, встретите только вопросы как же это сделать?

закроем тему, и давайте жить дружно
0
Автор FAQ
 Аватар для -=ЮрА=-
6614 / 4256 / 401
Регистрация: 08.08.2009
Сообщений: 10,325
Записей в блоге: 24
10.04.2013, 00:02
Цитата Сообщение от abit Посмотреть сообщение
твой код не работает в том, что я просил - VS C++ 2010 Express, крякнутым софтом я пользоваться не буду, упорство тут не причём, я работаю над оборонными заказами РФ, и мой код контролируется кучей органов
- тем приёмом который в посте 1 описываешь не сделаешь.
PS:Оборонка тем более деньги имеет на софт

Цитата Сообщение от abit Посмотреть сообщение
я забью дофига драгоценной памяти хотя бы твоей строкой char szMsg[256]; - там каждый бит на счету
- да что ты к ней пристал, тьфу блин ну а если бы просто прописал в нити строковый литерал, либо сразу в меседж боксе.
Я не вижу что ты понял и всё, ты уверен :
а) я не знаю чего-то там и поколдовав, ты обязательно запустишь static void Thread(PVOID pParams) на экспресе - не будет этого хочешь ты или нет, просто экспрес "не умеет" (нет нужных хедеров и либов) параллелить на плюсах
б)ты не умешь анализиролвать код, если ты не заметил мой стрковый лиетрал передаётся из основного потока в нить, я просто показал как идёт передача, и постоянно пытаешся меня попрекнуть strcpy пфф...
C++
1
2
3
4
void CParallel::ThreadFunc(PVOID pParam)
{
    MessageBox(GetForegroundWindow(), (char *)pParam, ";)", MB_OK);
}
млин я вообще мог туда хендл файла и ИД сокета воткнуть.
Научись видеть в простых вещах нечто большее, ведь всё гениальное чертовски просто.
в) Запомни если код нельзя написать так чтобы потом его написать снуля проснувшись ночью после того как проспал 3 часа, то этот код надо либо сжечь либо перерабоать в простой со стандартными железными провернными коснтрукциями.
Желаю тебе успехов в создании софта, на сим надобности в моей помощи либо советах более не вижу.
0
 Аватар для abit
868 / 527 / 148
Регистрация: 03.02.2013
Сообщений: 1,845
10.04.2013, 01:26  [ТС]
если ты не заметил мой стрковый лиетрал передаётся из основного потока в нить
жесть)
я эту передачу читал в куче мест, ты случаем не переводчик msdn? твой язык очень близок к нему)
хотя нет, слов " стрковый" и "лиетрал" я и там не встречал
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
10.04.2013, 01:26
Помогаю со студенческими работами здесь

Создал поток в классе (visual studio 2015). Возникли ошибки. Как исправить?
На нижеуказанных скринах описаны ошибки. Помогите пожалуйста их исправить. Потому что взял эти куски из примеров из нета. И судя по всему...

Доля отличников в классе больше 2/5, но меньше 3/7, а всего в классе не более 15 учеников. Сколько всего в классе учеников?
Добрый вечер! Подскажите, пожалуйста! &quot;Доля отличников в классе больше 2/5, но меньше 3/7, а всего в классе не более 15 учеников....

Поток освобождается, но переменная, которой был присвоен этот поток, не очищается
Мне интересно, вот поток отработал, стоит FreeOnTerminate:=True; Поток освобождается, но переменной которой было присвоен этот поток, не...

Создал поток. В нем выделил буффер. Поток выполнился, но из за буфера ругнулся.
В функции треда создал буфер char tbuf;но после того как тред выполнился выскочила ошибка Run-Time Check Failure #2 - Stack around the...

Ошибка-Текущий поток должен быть задан как поток однопоточного контейнера STA
Значит модуль в нем классы.Я создаю свое гуи.Так вот при вызове процедуры котрая копирует текст(в буфер) вылезает эта ошибка я уже с ней...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Новые блоги и статьи
сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и источниками (напряжения, ЭДС и тока). Найти токи и напряжения во всех элементах. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru