Wykonywanie 2 funkcji rownolegle

0

Mam problem z tym że nie wiem w jaki sposób mogę wykonywać 2 funkcje równolegle w c++. Dokładniej to mam dwie funkcje które rysują szereg figur (korzystam z biblioteki allegro) i chciałbym aby rysowały je równolegle a nie tak jak do tej pory jedna po drugiej. Da się to jakoś zrobić? Proszę o pomoc.

0

Poczytaj o wątkach, chociaż tu prawdopodobnie wystarczy wcześniej rysować po jakimś buforze. Nie znam allegro, więc więcej Ci nie powiem.

0

A mógłbym prosić o bardziej konkretne wskazówki, dopiero zaczynam programować... Próbowałem skorzystać z biblioteki process.h ale nie bardzo wychodzi.

0

Ciężko o więcej szczegółów, bo nie opisałeś problemu wystarczająco dokładnie.
Co oznacza dla Ciebie to rysowanie równolegle? Na ekranie się nie pojawiają się, czy chodzi Ci o jakieś optymalizacje kodu?
Bez jakiegoś kodu ciężko cokolwiek powiedzieć.
Skoro dopiero zaczynasz programować to zabawa w grafikę będzie ciężka.

Możesz stworzyć kilka wątków, które jednocześnie będą rysowały scenę, ale to może nie być takie proste. Kwestia synchronizacji wątków może być problematyczna, szczególnie bez pewnych podstaw.

Możesz też rysować te figury normalnie ale, w jakimś buforze i później podmieniać ten bufor z tym co jest wyświetlane na ekranie - allegro zapewne ma takie możliwości, ale to musisz doczytać w dokumentacji czy jakichś tutorialach.

0

Zatem mam dwie funkcje o prototypie void rysuj1(int &x,int &y) i void rysuj2(int &a,int &b) które rysują ciągi znaków zaczynając od współdłużnych x,y lub a,b i teraz chciałbym aby rysowały je w tym samym czasie to znaczy zaczynały rysować w tym samym czasie a nie tak że jak jedna skończy rysować to zaczyna dopiero druga (nie chodzi mi o optymalizacje kodu). Zależy mi na tej równoczesności, chcę widzieć proces rysowania tych dwóch funkcji jednocześnie na ekranie.

1

Aha, no to jeszcze inaczej. Musisz uzależnić to co jest rysowane od postępu w czasie. Funkcje możesz wywoływać jedna po drugiej, ale jedna jak i druga musi rysować tyle ile chcesz, żeby w danym czasie zostało narysowane. Z tym, że jako czas możesz wziąć np. ilość obiegów głównej pętli renderującej grafikę, żeby się na początki nie motać obliczeniami.

1

Jeśli korzystasz z C++11 to możesz zrobić coś na wzór tego kodu:

#include <cassert>
#include <climits>
#include <cstdio>
#include <cstdlib>
#include <ctime>
#include <ctype.h>

#include <iostream>
#include <thread>
#include <vector>

void fill(int start, int after, int * tab) {
  for (int i = start; i < after; i++)
    tab[i] = i;
}

int main(int argc, char** argv) {
  int tab[20];
  std::thread t1(fill, 0, 10, tab);
  std::thread t2(fill, 10, 20, tab);
  t1.join();
  t2.join();
  for (auto &v : tab) {
    std::cout << v << " ";
  }
}

Na GCC 4.6.1 działa ;)

0

Dziękuje za odpowiedzi, jutro do tego wrócę bo sen już mnie zmorzył. Wibowid dzięki za przykład, już zauważyłem ze nie mam biblioteki thread, mam nadzieje że to nie okaże się problemem i jutro ją zainstaluje i sprawdzę działanie tego programiku, może na jego podstawie coś mi się uda.

0

To jest biblioteka z STLa, musisz zaktualizować cały kompilator. Jeśli nie możesz zaktualizować kompilatora, to zostaje np biblioteka pthreads, którą się nieco ciężej używa. Albo boost::thread. Albo OpenMP, itd

0

Ja używam Microsoft Visual C++ 2010 Express i nie jestem pewny czy mam którąkolwiek z bibliotek którą wymieniłeś bo ciągle mi pokazuje ich brak. Co do OpenMP to mogę włączyć OpenMP Support ale gdy dodaje plik nagłówkowy omp.h to jej nie może znaleźć, oznacza to że jej nie mam czy może po prostu nie jest potrzebny tan plik nagłówkowy?

1

OpenMP jest niedostępne w wersji express tutaj jest jakieś obejście na to :
http://kenny-tm.xanga.com/651048063/parallel-programming-using-openmp-with-visual-c-2008-express/

2

Nie. Nie używaj wątków.

Niech twoja funkcja rysująca rysuje tylko wybrany fragment obiektu zadany przez dodatkowy parametr. Wtedy w kolejnych obiegach głównej pętli będziesz mógł dorysowywać kolejne fragmenty.

1

Dobrze byłoby żebyś pokazał jaki jest efekt końcowy (graficznie), bo jeśli to jakieś dwie proste to nie są potrzebne żadne wątki czy równoległość tylko stawianie pikseli z dwóch zbiorów na przemian.

0

Wielkie dzięki za odpowiedzi. Poradziłem już sobie z problemem idąc za waszą radą i rysując na przemian. Teraz jeszcze pokombinuje i postaram się użyć do tego OpenMP i opcji sections tylko muszę jeszcze o tym poczytać, dzięki...

1 użytkowników online, w tym zalogowanych: 0, gości: 1