Autor Wątek: dodanie timera do kolejki  (Przeczytany 1259 razy)

Offline gawron89

  • Użytkownik

# Marzec 25, 2014, 12:48:36
witam, przy pomocy boosta stworzyłem kolejkę w oddzielnym wątku która wygląda tak
void WorkQueue::add(message_type_t type, param_t low, param_t high)
{
boost::mutex::scoped_lock lk(mutex_);
event_message_t* m = alloc_message(type, low, high);
bool empty = q_.empty();
q_.push_back(m);
if(empty)
conditional_.notify_one();
}

//watek boost
void WorkQueue::worker()
{
event_message_t* m = 0;
while(1)
{
while(!stop_)
{
{
boost::mutex::scoped_lock lock(mutex_);
while(q_.empty() && !stop_)
conditional_.wait(lock);
if(!stop_)
{
m = q_.front();
q_.pop_front();
}
}
if(!stop_)
{
process(m);
}
free_message(m);
m = 0;
}

if(stop_)
return;
}
}

int WorkQueue::process( event_message_t* m )
{ switch (m->type)
{
case EV_PRINT_TO_CONSOLE:
{
std::cout << m->str;
break;
}

default:
return 1;
}
return 0;
}


event_message_t* WorkQueue::alloc_message( message_type_t type,
  param_t low, param_t high )
{
event_message_t* m = new event_message_t;
m->type = type;
m->low = low;
m->high = high ;

switch (type)
{
case EV_PRINT_TO_CONSOLE:
m->str = (const char*)low;
break;
default:
delete m;
return 0;
}

return m;
}

void WorkQueue::free_message( event_message_t* m )
{
switch (m->type)
{
case EV_PRINT_TO_CONSOLE:
default:
delete m;
break;
}
}


uzycie tego wygląda tak
int main()
{
WorkQueue q;
q.add(EV_PRINT_TO_CONSOLE, "hello ", 0);
q.add(EV_PRINT_TO_CONSOLE, "world\n", 0);

// blokada głownego wątku na potrzeby tego przykladu
while(1){}
}
funkcja process wykonuje odpowiednie działania.

potrzebuje przerobic funkcje worker tak aby to było możliwy kod poniżej, bo nie mam pojęcia jak się za to zabrać
int timerid = 1;
int seconds = 5;
q.add(EV_TIMER, (param_t)timerid, (param_t)seconds); // wykona sie pozniej
q.add(EV_PRINT_TO_CONSOLE, "hello ", 0);
q.add(EV_PRINT_TO_CONSOLE, "world\n", 0);

nie chce używać dodatkowego wątku do liczenia czasu ani boost asio, sygnatura add musi pozostać bez zmian.
ktoś może podsunąć jakiś pomysł?

Offline Mr. Spam

  • Miłośnik przetworów mięsnych

Offline Xirdus

  • Redaktor

# Marzec 25, 2014, 23:01:33
Twój problem leży na dużo wyższym poziomie niż ci się wydaje - a mianowicie w architekturze całej aplikacji. Powiedz, do czego ma służyć ta kolejka? Co będą robić wątki z niej korzystające, i dlaczego będą musiały ze sobą wymieniać wiadomości? Bo klasa WorkQueue, która sama przetwarza wszystkie wiadomości, śmierdzi mi błędem projektowym., i to ostro.

Offline gawron89

  • Użytkownik

# Marzec 26, 2014, 10:27:26
powiedzmy ze robię symulator windowsa, główna aplikacja to system, do tego dochodzą programy pisane na ten system. każdy program to plik dll, w tym pliku dll jest funkcja main. po uruchomieniu takiego programu dostaje on swój własny wątek który komunikuje się z innymi wątkami przez wiadomości podobne do tych co są w winapi. dll-ki sa kompilowane rożnymi kompilatorami dlatego muszę trzymać się interfejsu C. nic lepszego niż callbacki z winapi nie znam wiec postawiłem na to rozwiązanie.

po paru głębszych przemyśleniach wymyśliłem jak to zrobić, ale jestem zbyt leniwy wiec wybrałem drogę kolejnego wątku, myślę ze na razie wystarczy
« Ostatnia zmiana: Marzec 26, 2014, 21:54:39 wysłana przez gawron89 »