Pokaż wiadomości

Ta sekcja pozwala Ci zobaczyć wszystkie wiadomości wysłane przez tego użytkownika. Zwróć uwagę, że możesz widzieć tylko wiadomości wysłane w działach do których masz aktualnie dostęp.


Wiadomości - gawron89

Strony: [1] 2 3
1
C++ / Odp: boost conditional variable
« dnia: Lipiec 25, 2014, 11:59:47 »
to co opisujesz występuje tylko na poziomie kilkuset milisekund a nie kilku sekund. w moim głównym programie zdarza się ze func() w ogolę nie wywołuje notify_one() a cond.wait_for zwraca po ustalonych 30 sekundach no_timeout, no cos jest nie tak.
wiec albo uzywam wait_for zle, np potrzebna jest jakas petla (na necie nie ma żadnych przykładów użycia wait_for z pętla), albo implementacja boosta ma jakis błąd.


edit:
dobra, w samej dokumentacji znalazłem ze wait_for może przekłamywać jeśli chodzi o zwracaną wartość, nie obejdzie się więc bez funkcji pomocniczej, to jest chyba poprawny kod
using namespace boost;

condition_variable cond;
mutex m;
bool done = 0;

bool need_continue()
{
return done;
}

void func()
{
this_thread::sleep_for(chrono::seconds(4));
done = 1;
cond.notify_one();
}

int main()
{
for(;;)
{
done = 0;
thread t(func);
mutex::scoped_lock lock(m);
if(!cond.wait_until(lock, chrono::system_clock::now() +
chrono::seconds(2), need_continue))
{
std::cout << "timeout\n";
}
else
{
std::cout << "no_timeout\n";
}
t.join();
}
return 0;
}

2
C++ / boost conditional variable
« dnia: Lipiec 25, 2014, 10:46:00 »
witam, mam problem z takim kodem

using namespace boost;

condition_variable cond;
mutex m;

void func()
{
this_thread::sleep(posix_time::seconds(4));
cond.notify_one();
}

int main()
{
for(;;)
{
thread t(func);
mutex::scoped_lock lock(m);
if(cond.wait_for(lock, chrono::seconds(2)) == cv_status::timeout)
{
std::cout << "timeout\n";
}
else
{
std::cout << "error\n";
}
t.join();
}
return 0;
}

watek główny jest blokowany az drugi watek wywoła notify_one() lub miną 2 sekundy. drugi watek ustawiony jest na 4 sekundy, wiec cond.wait_for według mnie zawsze powinno zwracać timeout, natomiast wartość zwracana jest dosłownie losowa, raz timeout a następnym razem nie, wypisuje error ~7 na 10 razy. co tu zmienić by to działało?


3
Projektowanie kodu / Odp: dodanie timera do kolejki
« dnia: 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

4
Projektowanie kodu / dodanie timera do kolejki
« dnia: 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ł?

5
psp tez nie ma oficjalnego wsparcia ogl, jedynie jakis amatorski port ktorego zadna wieksza firma na powaznie nie wezmie

6
Szkółka / Odp: Prosta biblioteka do czytania archiwów.
« dnia: Styczeń 17, 2012, 00:56:53 »
jeśli ta biblioteka ma służyć tylko do gier, to myślę ze łatwiejszej od tej nie znajdziesz http://icculus.org/physfs/, ja tego używam i jestem zadowolony

7
reserve tylko rezerwuje miejsce w pamięci i po użyciu takiej funkcji z winapi jak wyżej, string::size() zwróci 0, lepiej zastosować string::resize();

8
Inne / wyszukiwanie w google image
« dnia: Grudzień 26, 2011, 21:44:02 »
witam
pisze w tej chwili własna przeglądarkę do zdjęć ala faststone i chciałbym dodać opcje wyszukiwania podobnych zdjęć w serwisach google image, iqdb.org i innych. wszystko chciałbym wyświetlić w przeglądarce jako nowa karta. i wymyśliłem tylko to ze gdy wybierze się prawym na zdjęcie i szukaj, będę generował w tle plik html który potem otworze, a przeglądarka wysle zdjęcie które znajduje się u mnie na dysku do serwisu i wyświetli rezultaty. pytanie czy takie coś jest możliwe? znam tylko html i podstawy podstaw js i w sumie nie mam pojęcia jak napisać taki skrypt, za wszelkie wskazówki będę wdzięczny.

Pozdrawiam

10
Językoznawstwo / Odp: pauza skryptu lua/inne
« dnia: Wrzesień 20, 2011, 00:32:29 »
zrobiłem coś takiego
Kod: (lua) [Zaznacz]
GAW_PAUSED_COROUTINES_TABLE_ = {}

function GAW_PAUSED_COROUTINES_CHECK_()
for k, v in pairs(GAW_PAUSED_COROUTINES_TABLE_) do
if(v < os.time()) then
local co=k;
GAW_PAUSED_COROUTINES_TABLE_[k]=nil;
coroutine.resume(co);
return;
end
end
end

--magiczna funkcja pauzujaca watek
function wait(t)
local co = coroutine.running();
GAW_PAUSED_COROUTINES_TABLE_[co] = os.time() + t;
coroutine.yield();
end


--przykladowy callback, normalnie tworzony z c++
co=coroutine.create(function()
wait(3);
print("fdfg")
wait(3);
print("fdfg")
wait(3);
print("fdfg")
end)
coroutine.resume(co)


while true do
--ta funkcja jest wywolywana z c++ co klatke
GAW_PAUSED_COROUTINES_CHECK_()
end
ten przykład działa z sciTE, ładnie się zintegrowało z c++, mam wątpliwości co do kolejności wznawiania wątków ale dopóki działa nie będę tego ruszał ;D
dzięki wszystkim


11
Językoznawstwo / Odp: pauza skryptu lua/inne
« dnia: Wrzesień 19, 2011, 17:54:12 »
rozwiązanie z delegatem raczej odpada, gdy ożyjemy go w jednej funkcji kilka razy pod rzad robi się straszny syf
onStart = function()
   local time = 10
   unit:move(x, y)
   fade(time, function()
      unit:kill()
      fade(time, function()
      unit:something()
         fade(time, function()
            unit:something()
            --itd.
         end)
      end)
   end)
end

o coroutines czytałem i nie mam pojęcia jak tego użyć, myślałem o tym by zastąpić nimi wszystkie normalne callbacki, użycie fade spowoduje zapisanie funkcji do jakiejś globalnej tablicy razem z czasem, yield itd. problem będzie jeśli użyjemy fade poza coroutines, drugim problemem jest to ze coroutine można użyć tylko raz potem znowu trzeba stworzyć nowy callback z nowym adresem funkcji, nie wiem czy dobrze kombinuje

12
Językoznawstwo / pauza skryptu lua/inne
« dnia: Wrzesień 19, 2011, 16:38:23 »
witam
problem przedstawię przykładem
Kod: (lua) [Zaznacz]
onStart = function()
   local time = 10;
   unit:move(x, y);  --1
   screen:fadeout(time);  --2
   unit:kill(); --3
end

1. jednostka zaczyna się poruszać ofc
2. tutaj problem, ekran zaczyna się rozjaśniać i skrypt powinien zaczekać cale 10 sec aż do pełnego rozjaśnienia, w miedzy czasie kod c++ musi być normalnie wykonywany
3. po 10 sec dead

moim założeniem jest stworzyć jak najbardziej prosty interface w skryptach, bardzo zbliżony do tego co mamy w edytorze wyzwalaczy w warcrafcie 3, chce uniknąć jakiegokolwiek liczenia klatek wewnątrz skryptów. czy jest to możliwe w lua?
project nie jest jeszcze rozpoczęty i jestem w stanie zmienić język na jakikolwiek inny, byle dało się zrobić coś równie prostego

13
C++ / Odp: problem z linkowaniem
« dnia: Czerwiec 23, 2011, 19:26:22 »
ok to juz udalo mi sie jakos naprawic, glupi blad, roznily sie runtime libraries.

//edit
dziala tylko po czesci, zawsze dodawalem liby tak: #pragma comment(lib, "cos.lib")ale ten sposob chyba nie dziala w libach, a jak dodam w Librarian -> Additional Dependencies to nie ma problemow. ktos wie czemu? visual 2010

14
C++ / problem z linkowaniem
« dnia: Czerwiec 23, 2011, 17:26:49 »
witam
postaram sie opisac moj problem jak najprosciej, jest sobie jakas biblioteka 1.lib, ja robie wrappera tworzac swoj 2.lib, i teraz gdy dodaje moj lib do programu testowego musze takze dodac 1.lib, jest mozliwosc aby moj 2.lib zawieral w sobie 1.lib i nie trzeba bylo go linkowac? twoche probowalem zmieniac opcje linkera ale jakos mi to nie wychodzilo

pozdro

15
mozesz zadeklarowac bazowa funkcje push jako abstrakcyjna, na visualu to pomoglo
template <class T>
class CListBase
{
protected:
    unsigned int CurrentNo;
public:
    CListBase();
    virtual ~CListBase();
   
    virtual void Push(T Dane, unsigned int Place) = 0;
    void Push(T Dane);
};

Strony: [1] 2 3