Współbieżnosć WinAPI, czyli generowanie c++ dla javowca

0

Mam taki plan na stworzenie wątku w C++ (z wykorzystaniem biblioteki windows.h):

DWORD WINAPI FunkcjaWatku(PVOID pvParam)
{
  return 0;
}

int main(int argc, char *argv[])
{   
    CreateThread(NULL, 0, FunkcjaWatku, NULL, 0, NULL);

    return EXIT_SUCCESS;
}

Trzeba jednak w tym przypadku zdefiniować działanie wątku na zewnątrz. Jest jakiś sposób, który pozwoli na stworzenie wątku bez zewnętrznej definicji (nie wychodząc poza funkcję main) ?

0

Nie, nie ma. Przynajmniej w tym względzie nie ma burdelu.

Tzn. nie do końca... Miałem już nie pokazywać idiotycznych praktyk w C++, ale można użyć ew. lokalnej klasy/struktury z metodą statyczną:

#include <windows.h>

int main()
{
  struct Zuo {
      static DWORD WINAPI zue(LPVOID zuo) {
        return 0;
  }};

  CreateThread(NULL, 0, Zuo::zue, NULL, 0, NULL);
}

...ale za użycie czegoś takiego powinno się wszystkie palce połamać.

0

To jeszcze jedna sprawa - zamieniłeś PVOID na LPVOID - czemu ? Da się jakoś uniknąć tworzenia funkcji z parametrem ? Jakiś jest sens jego przekazywania ?

0

Ten argument jest po to żebyś coś dodatkowego mógł przekazać, stan/wtf. Nie możesz wprost wywołać metody bo metoda nie jest zwyczajną funkcją, wtedy robisz metodę statyczną i this przekazujesz jako ten właśnie argument.

Czemu zmieniłem? Generalnie większość WINAPI używa LP* we wskaźnikach, co jest równoważne P*, ot trzymanie się konwencji.

0

Generalnie WINAPI to API kompatybilne z C, zainwestuj w coś sensownego dla C++ jeżeli chcesz wygodnie z wątków korzystać.

0

Więc jeśli chcę stworzyć wątek, który tworzy wątek to będzie to wyglądać tak jak poniżej ? Czyli wywoła się 2 razy 'return 0' w 2óch odrębnych wątkach ? Działanie od strony użytkownika przypomina wywoływanie wątków w Javie ? A metoda fork() jest standardową metodą C ? Bo gdzieś zauważyłem, że ktoś wspominał, że to metoda pod Linuksa. Możliwe jednak, że chodziło o inną metodę.

#include <windows.h>

int main()
{
  struct Zuo {
      static DWORD WINAPI zue(LPVOID zuo) {

	struct Zuo2 {
      		static DWORD WINAPI zue2(LPVOID zuo2) {
        			return 0;
  	}};

  	CreateThread(NULL, 0, Zuo2::zue2, NULL, 0, NULL);

        	return 0;
  }};

  CreateThread(NULL, 0, Zuo::zue, NULL, 0, NULL);
}
0

A połamać Ci palce i nie tylko?

0

Powiem tak - niewiele miałem do czynienia z C++. Piszę aplikację, która generuje kod w różnych językach na podstawie diagramów. I generując kod generator może natrafić na diagram symbolizujący wątek, w którym wykonywane są dalsze instrukcje. W C++ kod generuje nieobiektowo. Jeśli ktoś może mi doradzić czego mam użyć to pokłon. Jeśli miałbym coś sensownego wyciągnąć na temat wątków w C++, musiałbym przeczytać jakąś sensowną książkę, nie szukać zlepków informacji w internecie, bo przez nie powstaje za dużo pytań. Więc jak ktoś mi doradzi z jakiej metody skorzystać to skupię się na szukaniu tej właśnie metody. Metoda fork() była specyficzna, ale w przypadku mojej aplikacji chyba łatwiejsza do wykorzystania.

0

Ps. Nie piszę w C++, ale w Javie, a przerzutka z Javy na C++ może spowodować wstrząs mózgu przy niektórych operacjach.

0

Pisałem o boost? Podstawowa biblioteka jeżeli chodzi o wszystko, czego nie ma w bibliotece standardowej C++, w tym wątki, pamięć współdzielona etc. Posiada świetną dokumentację.

0

A metoda fork() jest standardową metodą C ?

Nie, nie jest to standardowa funkcja C, istnieje tylko pod Linuksem i z wątkami nie ma nic wspólnego, chociaż w pewnych przypadkach może spełniać podobną funkcję jak wątki.

0

Ok, znalazłem tworzenie wątków w boost.

#include <boost/thread/thread.hpp>
#include <iostream>
using namespace std; 

void hello_world() {
  cout << "Witaj świecie, jestem wątkiem!" << endl;
}

int main(int argc, char* argv[]) {
  // utwórz nowy wątek wywołujący funkcję "hello_world"
  boost::thread my_thread(&hello_world);
  // poczekaj na zakończenie wątku
  my_thread.join();
  
  return 0;
}

Widzę jednak, że ta klasa nie jest wbudowana (mimo, że jak czytałem ceniona i coraz częściej używana). Żeby sobie skompilować taki kod musiałbym podłączyć bibliotekę z zewnątrz (a sposób tego jest zapewne zależny od środowiska), zgadza się ?

0

klasa = biblioteka

0

Powiem tak - niewiele miałem do czynienia z C++. Piszę aplikację, która generuje kod w różnych językach na podstawie diagramów. I generując kod generator może natrafić na diagram symbolizujący wątek, w którym wykonywane są dalsze instrukcje. W C++ kod generuje nieobiektowo. Jeśli ktoś może mi doradzić czego mam użyć to pokłon. Jeśli miałbym coś sensownego wyciągnąć na temat wątków w C++

A co z tematem wątku : Współbieżnosć WinAPI

Widzę jednak, że ta klasa nie jest wbudowana (mimo, że jak czytałem ceniona i coraz częściej używana). Żeby sobie skompilować taki kod musiałbym podłączyć bibliotekę z zewnątrz (a sposób tego jest zapewne zależny od środowiska), zgadza się ?

No.
Miało być pięknie , standardowo , przenośnie i uniwersalnie a wyszło jak zwykle , burdel ...
Wydaje mi się że szukasz czegoś czego nie ma , jak chcesz korzystać z wątków w C++ to musisz
użyć zewnętrznej biblioteki .
Nawet jak chcesz byle co wypisać na ekran to używasz zewnętrznej biblioteki I/O .
Jest coś takiego jak klasa wbudowana w C++ ?
Może chodzi o klasę z bibliotek objętych obecnym standardem ...
chyba że napiszesz własną klasę , a implementacja poszczególnych fu. będzie zależna już od biblioteki
zewnętrznej , kompilatora i systemu operacyjnego - powodzenia.

0

Zastanawia mnie teraz kolejna rzecz. Zauważyłem, że w C++ (tworzonym nieobiektowo) trzeba deklarować procedury po kolei. Jeśli druga wywołuje pierwszą, to najpierw trzeba stworzyć pierwszą. To jednak powoduje problem w przypadku procedury, która tworzy wątek wywołujący tą procedurę, która go tworzy :). Inaczej - jest rekurencja, w której procedura powołuje do życia kolejne takie same, ale coraz bardziej wewnętrzne (wątki w wątku) wątki. Przykład dla Javy:

void createProcess()
{
	new Thread(new Runnable(){
		public void run(){
			//coś zaczyna działać
			createProcess();		
		}
	}).start();
}

Dla C++:

void thread_proc()
{
	//coś zaczyna działać
	createProcess();	
}

void createProcess()
{
	boost::thread new_thread(&thread_proc);
}

Żeby createProcess mógł użyć procedury thread_proc wykonywanej w wątku new_thread ta procedura musiałaby zostać zadeklarowana najpierw. Ale jeśli zadeklaruję ją najpierw to nie rozpozna procedury createProcess, bo jeszcze nie została zadeklarowana. To tylko przykład, który można rozwiązać wywołując createProcess w samej sobie zamiast w thread_proc:

void createProcess()
{
	boost::thread new_thread(&thread_proc);
	createProcess();	
}

Zakładając jednak, że nie wiadomo, czy dojdzie do rekurencji (bezpośredniej lub nie) - można to jakoś rozwiązać ? Stosując wskaźniki, referencje, etc. Żeby np. wykluczyć ścisłą kolejność deklarowania procedur. Chociaż nie mam pewności, czy zastosowanie referencji samej w sobie (&thread_proc) jako argumentu procedury nie rozwiązuje tego problemu. Póki co mam problem z kompilacją, więc proszę o wyczerpującą odpowiedź :].

0

można to jakoś rozwiązać ?

Tak ucząc się podstaw C++ zamiast kombinować...

#include <iostream>

void createProcess(void);
void thread_proc(void);

//---------------------------------------------------------------------------
#pragma argsused
int main(int argc, char **argv)
{
      ;
        return 0;
}
//---------------------------------------------------------------------------
void thread_proc(void)
{
        //coś zaczyna działać
        createProcess();
}
//---------------------------------------------------------------------------
void createProcess(void)
{
        ;
}
//------------------------------
0

C++ ma znacznie większe możliwości za cenę cholernego skomplikowania i niespójności. Java? Java ma to do siebie, że każdy idiota w tym pisać może.

Tak, ma też większe możliwości niż Word, ale każdy kto chce napisać jakiś tekst z jakiegoś powodu używa Worda. Poza tym w niejednym przypadku Java sprawdza się lepiej. Np. w tym, do którego ja ją wykorzystuje. Nie starczy mi w życiu czasu, żeby zacząć pisać gry na skalę światową, więc na razie u siebie nie widzę dla C++ większego zastosowania. Każdy idiota potrafi sobie też wytrzeć tyłek miękkim papierem toaletowym, a przecież prawdziwe wyzwanie to stosowanie papieru ściernego. A co do zasad OOP w Javie ... prędzej te zasady można połamać w C++.

Jak jesteś chory to płacisz lekarzowi... chcesz program w C++ to dział Praca zaprasza.

Nie za wszystkie usługi się płaci (nie chodzi mi o lekarzy). Poza tym nikogo do niczego nie zmuszam. Liczę po prostu na dobrą wolę - a nigdy nikt niczego nie nauczy się lepiej sam niż od kogoś (a skoro nie znam C++ to skąd mam wiedzieć czego szukać, skoro nie wiem, że to istnieje - a piszę na forum, bo zwyczajnie nie mam czasu na gruntowną naukę C++ teraz, terminy są bezwzględne). I nie "zawracam d-py", bo chyba post na forum nikomu nie przeszkadza ? Przeszkodziłem komuś w koncentracji nad ważnym zadaniem ? Przerwałem pracę ? Ktoś czuje się zobowiązany do odpisywania na moje pytania ?

Po co? Pomyślmy, chcesz napisać program w C++?

Nie, nie chcę. Muszę, ale to nawet nie program .. tylko tyle o ile pytałem. Potem na długie lata C++ już nie będzie przeze mnie używany. Nawet dobrym pomysłem byłoby nauczenie się go, ale musiałbym przestać spać i nauczyć się zaginać czasoprzestrzeń.

To nie zawracaj d..y .

Tego już kompletnie nie rozumiem. Patrz wyżej. Przeszkodziłem w czymś ? Pytałem konkretnie ciebie ? Dzięki za odpowiedź, która się okazała pomocna, ale nie pisz, że zawracam d-pe i to akurat tobie.
Według ciebie kiedy mam zadawać pytania ? Kiedy znam odpowiedź ? Jak potrafiłbym coś zrobić, albo miałbym czas, żeby przetestować wszelkie możliwości to zadawanie pytania byłoby pozbawione celu. Poza tym do większości rzeczy doszedłem sam - pewne rzeczy chciałem uściślić i po prostu dowiedzieć się, czy ktoś kto ma doświadczenie w C++ ma lepszy sposób. Sam podałem forka i przykład z WinAPI. Za każdym razem jak coś znajdę to mam zakładać, że na pewno jest coś lepszego i szukać aż zdechne ze starości ? Znalazłem - zapytałem i ktoś mi polecił bibliotekę boost. Poszukałem, napisałem przykład i znowu zapytałem o kolejność deklaracji - w Javie nie ma czegoś takiego, może w obiektowym C++ też .. a tutaj sam zaproponowałem wykorzystanie wskaźników - jak widać, jest inny sposób. Zamysł ogólny wskaźników znam, ale w C++ jest dużo myków, których w podstawach nie ma, chyba że jako podstawy rozumiesz 1000 stron książki - do jutra nie przeczytam. Zamiast się stroszyć przeanalizuj co piszę.

Odnosząc się jeszcze do tego, ze każdy idiota może pisać w Javie - cwaniakowanie i ślepa miłość do C++ ... skoro tak sobie cenisz skuteczność kosztem często bezsensownego skomplikowania to pisz w assemblerze. Chyba nie za wiele wiesz o Javie skoro uważasz, że każdy idiota może w tym pisać. Kompletna bzdura. Zależy kto jak pisze. To , że ktoś umie pisać nie znaczy, że napiszę dobrą książkę. Poza tym pisząc w Javie możesz pisać w C++, łączyć technologie. Śmieszy mnie takie wywyższanie się.

Mimo wszystko dzięki za zainteresowanie tematem.

0

pociałem wątek z pyskówki, zostawiając to, co uznałem, że powinno być ostatnim w niej słowem, jako pouczenie dla tych, co przegieli traktujac autora defaultowo jak debila. co do samej dyskusji -- sęk w tym, że obie strony miały rację, objeżdzający trochę też - piszesz cos zawierajacego generator kodu c++? powinienes go znac na wylot. kod dla Javy generuje się banalnie i kontroluje się go później równie łatwo. Z c++ już nie tak łatwo, choćby z tego powodu, że musisz uważać na pół setki rzeczy, których jako programista Javy sorry, ale (najprawdopodobniej) po protsu nie jesteś w stanie sam sobie wyobrazić albo choćby przewidziec, a tym bardziej pozniej zdebugowac.. wyobraz sobie, ze przychodzi do Ciebie programista Pascala twierdzac, ze ma pomysl jak poprawic cos w kontenerze EE, cos tam dlubie a potem dziwi się ze np. com/sun/blah/Ble.java jest mapowane z klasa com.sun.blah.Ble tylko na podstawie sciezki i sie nie da tej klasy umiescic w innym pakiecie/katalogu.. Twoja reakcja jako obeznanego w Javie pewnie bylaby pierwotnie podobna. Moze i nie tak od razu, ale wez pod uwage, ze po parunastu (nie mowie o Tobie) nowoprogramistach z prawie zerowa znajomoscia c++'a, roznymi ludziom ktorzy sa juz na forum od dawna po prostu siadaja nerwy w momencie gdy znow ktos pyta o podstawy.

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