Я реализую нить в стиле Java в C ++.Для этого у меня есть функция Thread :: Start, но моя проблема в том, что когда я ее использую, она отлично работает только в первый раз, по какой-то причине, когда вызов экземпляра потока запускает ее по завершении, но я не могу вызвать start сноваи ни один из них не вызывает функцию запуска другого потока.
Это мой конструктор потока:
Thread::Thread()
{
m_handle = (HANDLE)_beginthreadex(0, 0, &call, this, CREATE_SUSPENDED, 0);
}
Деструктор потока:
Thread::~Thread()
{
if (m_handle) CloseHandle(m_handle);
}
Вызов функции, которая используется в качестве оболочки для функции Run.:
unsigned int __stdcall Thread::call(void* _this)
{
((Thread*)_this)->Run();
return 0;
}
И это моя функция запуска:
void Thread::Start()
{
if (m_handle) ResumeThread(m_handle);
}
И код, который имеет проблему, следующий:
Класс клерка:
struct Clerk : public Thread
{
Clerk()
{
IsOnService = false;
}
void Run()
{
std::cout << this->GetId() << " receive new customer " << '\n';
Sleep(2000);
std::cout << this->GetId() << " has finished" << '\n';
IsOnService = false;
}
bool IsOnService;
};
Класс обслуживания:
struct Service
{
Clerk* clerk;
Customer* customer;
Service(Clerk* c, Customer* cu)
{
clerk = c;
customer = cu;
clerk->Start();
}
~Service()
{
delete customer;
}
};
И основная функция:
int main()
{
int nClerks = 5;
Clerk* clerks[] = {
new Clerk(), new Clerk(), new Clerk(), new Clerk(), new Clerk()
};
Queue<Customer*> awaitingCustomers;
while (1)
{
if (GetAsyncKeyState(0x43) & 0x7FFF)
{
Customer* newCustomer = new Customer();
awaitingCustomers.Push(newCustomer);
while (!awaitingCustomers.IsEmpty())
{
for (int i = 0; i < nClerks; ++i)
{
if (!clerks[i]->IsOnService)
{
Service* newService = new Service(clerks[i], awaitingCustomers.Pop());
delete newService;
break;
}
}
}
}
}
for (int i = 0; i < nClerks; ++i) delete clerks[i];
return 0;
}
Когда я запускаю приведенный выше код, он вызывает функцию запуска только один раз, а не каждый разв этом я нажимаю клавишу «с».Мне нужно решение C ++ 98, спасибо.