C++Builder
  Начало   Форум   Помощь Войти Регистрация  
Страниц: [1]   Вниз
  Печать  
Автор Тема: Потоки от одного класса  (Прочитано 1377 раз)
Sergey1985
Участник


Сказали спасибо: +8/-1
Offline

Сообщений: 310


Потоки от одного класса
« : 22 Январь 2015, 11:16:06 »

Создаю класс потока File->New->Other->Thread
Но вместо одно указателя на этот поток завожу массив
Код
TSendThread *SendThread[8];

инициализация такая

Код
int MyThreadID[8]; // глобальный массив
 
SendThread[n] = new TSendThread(true);
MyThreadID[n] = SendThread[n]->ThreadID;
SendThread[n]->Resume();

Возможно ли при помощи одно модуля запустить несколько потоков делающих идентичные вещи   для разделения используется массив int MyThreadID[8]

« Последнее редактирование: 23 Январь 2015, 08:27:10 от S0mbre » Записан
S0mbre
Глобальный модератор


Сказали спасибо: +1113/-22
Offline

Сообщений: 2132

S0mbre


Re: Потоки от одного класса
« Ответ #1 : 23 Январь 2015, 11:48:02 »

Сергей, при оформлении сообщений используй, пожалуйста, форматирование кода (см. оформил твой пост).
По вопросу: да, конечно, можно запускать потоки на одинаковые задачи, ничего не мешает. Но я бы не стал заводить 2 массива для управления потоками. Лучше один, желательно динамический контейнер. Например:

Код
#include 
#include
 
// класс для хранения указателя на поток
 
class TMyThread
{
public:
TThread* Thread;
int ID;
 
__fastcall TMyThread(TThread* AThread=NULL) :
Thread(AThread), ID(-1)
{
if(AThread) ID = AThread->ThreadID;
}
 
virtual __fastcall ~TMyThread()
{
if(Thread) {
if(!Thread->Finished) {
Thread->Terminate();
Thread->WaitFor();
}
delete Thread;
}
}
 
bool __fastcall operator==(const TMyThread& obj)
{ return (ID == obj.ID); }
 
bool __fastcall operator==(const int AID)
{ return (ID == AID); }
 
bool __fastcall operator(const TMyThread& obj)
{ return (ID obj.ID); }
 
bool __fastcall operator(const int AID)
{ return (ID AID); }
};
 
// определение типа контейнера для потоков
 
typedef std::vectorTMyThread> TThreadCont;  // контейнер
typedef TThreadCont::iterator TThreadCont_I; // итератор
 
// заполнение контейнера
 
TThreadCont Threads;
for(int i=0; i8; i++) {
Threads.push_back(TMyThread(new TSendThread(true)));
}
 
// запуск всех потоков
 
for(TThreadCont_I it=Threads.begin(); it!=Threads.end(); ++it)
it->Thread->Suspended = false;
 
// удаление из контейнера останавливает и уничтожает связанный поток
 
Threads.pop_back(); // остановка и удаление последнего элемента (потока)
 
// поиск по заданному ID
 
TThreadCont_I it = std::find(Threads.begin(), Threads.end(), 1000); // найти поток с ID=1000
if(it != Threads.end()) Threads.erase(it); // остановить и удалить его
 
Записан
Sergey1985
Участник


Сказали спасибо: +8/-1
Offline

Сообщений: 310


Re: Потоки от одного класса
« Ответ #2 : 23 Январь 2015, 15:59:42 »

Н-да. С этим кодом неделю разбираться надо не меньше. Но как говориться учение и труд ...    Но все равно спасибо.
Записан
Sergey1985
Участник


Сказали спасибо: +8/-1
Offline

Сообщений: 310


« Ответ #3 : 26 Январь 2015, 10:37:24 »

Решил эту задачу также при помощи WinAPI. Получается даже проще.   Вот только для вывода информации на экран в Классе Thread есть метод Synchronize. А как будет выглядеть его аналог в WinAPI?
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  




....

Powered by SMF 1.1.21 | SMF © 2025, Simple Machines
Страница сгенерирована за 0.092 секунд. Запросов: 21.