Gå til innhold

Hva er det med windows da (.h) ?


Anbefalte innlegg

Har følgende include filer:

 

#include <iostream>
#include <fstream>
#include <math.h>
#include <vector>
#include <time.h>
#include <GL\glut.h>

 

og programmer kompilerer fint.

legger til windows.h slik:

#include <windows.h>
#include <iostream>
#include <fstream>
#include <math.h>
#include <vector>
#include <time.h>
#include <GL\glut.h>

 

og programmet kompilerer ikke... Mistenker det har noe med glut å gjøre, men jeg fatter ikke hva det kan være. Første jeg prøve var å flytte den og bruke den som første include.

 

Feilmeldingen er forsåvidt uinteressant i dette tilfeller:

error C2143: syntax error : missing ';' before 'constant'

 

men jeg hiver den no med alikavel...

 

Skulle bare ha tak i Sleep funksjoen, så om noen har noen tips til bedre cross platform timer funksjoner som ikke stjeler all cpu tid, så er jeg åpen for alternative løsninger...

(vet hvordan jeg skal jobbe meg rundt Sleep / sleep win/lin problematikken om jeg bare får inkludert filen)

Lenke til kommentar
Videoannonse
Annonse

Klarer ikke å reprodusere feilen. Trenger mer informasjon for å finne ut av feilen.

 

Det er mulig å bruke Sleep() uten å inkludere <windows.h>, men det er jo kanskje ikke så pent:

 

extern "C" __declspec(dllimport) void __stdcall Sleep(unsigned long dwMillisec);
#pragma comment ( lib, "kernel32.lib" )

int main()
{
  Sleep(1000);
}

Endret av kjetil7
Lenke til kommentar
Sikkert det beste slik som Kjetil skrev, men det er jo lov å spre kunnskap på et forum, i tilfelle det var litt oppklarende liksom.

Sant nok, men kunnskapen var nok allerede spredd i dette tilfellet :)

 

Det jeg viste var kun ment som et alternativ siden Herr_Dude fikk problemer når han inkluderte <windows.h>. Vi var alle klar over hva vi skulle inkludere (noe som kom fram i den første posten, og min post).

 

Men jeg er mer spent på om Herr_Dude har løst problemet sitt..

Endret av kjetil7
Lenke til kommentar

extern "C" __declspec(dllimport) void __stdcall Sleep(unsigned long dwMillisec);
#pragma comment ( lib, "kernel32.lib" )

 

Det funket det, har da tilgang til Sleep funksjoen i windows.

 

Kan desverre ikke gi mer info om hvorfor #include <windows.h> ikke funker, fordi jeg har ingen anelse om hvor jeg skal lete... kanskje jeg har noen feile instillinger, eller noe feil i openGL installasjoenen min. Jeg prøvde i et annet, tilsvarende prosjekt der jeg også bruker openGL, og resultatet var kompileringsfeil der også, så det er ting som tyder på at det har noe med de tingene der å gjøre.

 

Kunne tenke meg å teste på en annen maskin, men har ikke tilgang på det akkurat nå, men kan komme tilbake når jeg tester på en annen maskin.

 

Har forsåvidt det jeg trenger til å komme meg videre nå da, men om dette trigget noen andre til å forstå hva problemet kan være, så si gjerne i fra :) !

 

Mange takk for hjelpen Kjetil!

Er tydeligvis alltid noen som har en løsning her...

 

PS (Styggentorsken): Testet å bare inkludere "winbase.h" også, men fikk problemer der også... Selv om de var av noe annen karakter. Ettersom jeg har det jeg trenger ( Sleep ( ) ), så vil jeg ikke etterforske det noe nærmere akkurat nå. (igjen: sier fra hvis jeg finner ut av noe).

Lenke til kommentar

Ehhh, ok, det var jo ikke akkurat særlig vellykket :laugh: !

(fant akkurat ut at når Sleep kjøres sovner faktisk hele programmet... Slo meg faktisk ikke at events faktisk ikke fanges opp så lenge programmet sover, og sjekket det selvsagt ikke opp :blush: )

 

Noen som vet om et alternativ til Sleep som gjøre at programmet fortsatt kan fange opp events imens den sover ?

Beveger jeg meg da inn i multithread-helvete om jeg skal gjøre det plattform uavhengig ?

 

Har funnet svært lite om dette på nettet... Noen som har linker til gode artikler / tutorials rundt timere med linux / windows ?

 

(vurderer å gå over til kun å kjøre det i windows. nå..)

Lenke til kommentar
Beveger jeg meg da inn i multithread-helvete om jeg skal gjøre det plattform uavhengig ?

 

Vet lite om åssen du har lagt opp programmet ditt, men hvis det er lagt opp med en event-hånterings-loop .. og du sleep'er et sted i den (samme tråden); stopper alt opp.

 

Så alternativet blir da å bruke tråder gjetter jeg;

 

- CreateThread under Win32.

- pthread_create under Linux.

 

Wrapper du noe slikt i en klasse - så har du cross-platform tråder.

 

Slik har jeg satt det opp:

 

thread.h: http://scm.nostdal.net/cgi-bin/viewcvs.cgi....viewcvs-markup

thread.cpp (win32): http://scm.nostdal.net/cgi-bin/viewcvs.cgi....viewcvs-markup

thread.cpp (linux, riktignok "native", altså ikke posix/pthreads): http://scm.nostdal.net/cgi-bin/viewcvs.cgi....viewcvs-markup

 

(det er forresten en thread.h fil i linux/ og win32/ -subkatalogene; som blir inkludert fra "hoved" thread.h-fila)

 

Kode som viser opplegget i bruk:

...
#include "thread.h"

class Test : public Thread {
public:
int main()
{
sleep(1);
cout << "Test::main() is alive!" << endl;
} // main()
}; // class Test


int main()
{
Test t;
t.run();

while(1) {
cout << "main() is also alive!" << endl;
sleep(2);
}
}

 

main() is also alive!

Test::main() is alive!

Test::main() is alive!

main() is also alive!

...

 

..ellers har du altids ting som Boost.

 

Mulig det finnes andre løsninger også - litt ettersom hva du driver med.

Endret av søppel
Lenke til kommentar

Fange opp events mens du sover sier du, er ikke det cluet med en event-løkke? Du tar imot en event fra operativsystemet, håndterer den og returnerer. Etter at kontrollen har gått tilbake til operativsystemet bruker ikke programmet ditt CPU. Mulig at jeg misforsto hva du mente .. Har du kanskje en bestemt tid du skal sove, og ønsker å håndtere events i mellomtiden? Da kan det være greit å sette opp en timer, hvor du gir opp kontrollen til event-løkka, og du vil motta en timer-event etter en viss tid.

Lenke til kommentar

søppel: takker for fine eksempler på tråder.

 

A_N_K: Det jeg tenkte å utvikle denne ganger var et lite tetris spill, så da trenger jeg et god timer funksjon siden brikkene skal falle med en fart proposjonal med det nivået spilleren er kommet til. Til dette bruker jeg glut og openGL. Ettersom halve pointet med glut og openGL er at det er plattformuavhengig tenkte jeg at jeg kunne holde applikasjoen plattforuavhengig. Derfor var planen altså:

 

Translate brikke ned ved hvert "beat" av en eller annen klokke jeg setter opp, men imellomtiden må selvsagt brukeren få lov til å flytte og rotere elementene. Derfor tenkte jeg å sette opp en spillløkke slik:

 

while( inGame )
{
    mySleep( gamespeed ); // mySleep( ) --> Sleep() (win) || sleep() (linux)
    TranlateFalling( down );
    // + evt andre ting som skal skje ved hver beat


}

 

Jeg tenkte, tåpelig nok, ikke over at da vil bare programmet henge i denne løkken, fordi den ikke fanger opp events imens programmet sover, så da må jeg komme opp med en annen metode for å gjøre dette :).

 

Jeg har kikket litt på gamedev.net etter gode timer funksjoner for spill generelt, men virker som om det er for windows.

Lenke til kommentar

søppel: takker for fine eksempler på tråder.

 

A_N_K: Det jeg tenkte å utvikle denne gangen var et lite tetris spill, så da trenger jeg et god timer funksjon siden brikkene skal falle med en fart proposjonal med det nivået spilleren er kommet til. Til dette bruker jeg glut og openGL. Ettersom halve pointet med glut og openGL er at det er plattformuavhengig tenkte jeg at jeg kunne holde applikasjoen plattforuavhengig. Derfor var planen altså:

 

Translate brikke ned ved hvert "beat" av en eller annen klokke jeg setter opp, men imellomtiden må selvsagt brukeren få lov til å flytte og rotere elementene. Derfor tenkte jeg å sette opp en spillløkke slik:

 

while( inGame )
{
    mySleep( gamespeed ); // mySleep( ) --> Sleep() (win) || sleep() (linux)
    TranlateFalling( down );
    // + evt andre ting som skal skje ved hver beat

    inGame = !gameOver( ) && !quit;
}

 

Jeg tenkte, tåpelig nok, ikke over at da vil bare programmet henge i denne løkken, fordi den ikke fanger opp events imens programmet sover, så da må jeg komme opp med en annen metode for å gjøre dette :).

 

Jeg har kikket litt på gamedev.net etter gode timer funksjoner for spill generelt, men virker som om det stort sett er for windows...

 

Altså: en enkel og velkjent liten applikasjon som skal utvikles, men står litt fast på de her operativsystem avhengige funksjonene...

 

Så da forstår du gjerne problemstillingen bedre :thumbup: .

 

Jeg innser jeg burde skrevet det med engang, for å gjøre det klarere, men problemet var et ganske annet da jeg startet tråden, så da annså jeg det ikke som relevant.

Lenke til kommentar

Aiaiai... :no:

Leste akkurat i glut dokumentasjonen...

Tror dere ikke glut har en egen timer callback funksjon da :blush: ...

 

Jeg skal si ifra når jeg har fått det til å funke og hvordan jeg gjorde det...

 

Beklager hvis jeg har kastet bort tiden til folket, men jeg fant ikke timer callback funksjonen sist jeg lette etter den (på glut og openGL sine sider), men nå gjorde jeg altså det. Synes det var litt rart de ikke hadde det, så jeg prøvde igjen... i google.

Endret av Herr_Dude
Lenke til kommentar

Ok, her er slik jeg gjorde det... Er tidlig i utviklingen, så jeg har kun testet på at timeren funker:

 


void Tetris::gameLoop( int a )
{
g1.addPoints( 1 ); // ¤¤ for testing purposes
glutPostRedisplay( );
if ( gameStatus == GAME )
 glutTimerFunc( getGameSpeed( ),gameloop,0);
}

 

ok, så det som nå skjer er at poengene teller opp med den hastigheten timeren går i. gameloop er med liten L i loop, fordi jeg ikke kan gi klassenavnet på callbackfunksjoner i glut, så den koden kaller bare igjen opp tetris.gameLoop (rekursivt etter gamespeed, i millisekunder )... og dette funker!

 

Fordi timerfunkjonen sier hvilken funksjon som skal kalles opp om "gamespeed" millisekunder.

 

Igjen: sorry hvis noen av dere føler dere har kastet bort tiden, men forhåpentligvis er det flere enn meg som har lært noe nyttig her!

Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...