Сергей, при оформлении сообщений используй, пожалуйста, форматирование кода (см. оформил твой пост).
По вопросу: да, конечно, можно запускать потоки на одинаковые задачи, ничего не мешает. Но я бы не стал заводить 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); // остановить и удалить его