alarmfunktion på Linux og Windows - > kan ikke finde et tilsvarende for Windows - > C

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg har arbejdet i nogen tid på Linux og lavet nogle C-programmer, og nu skal jeg bygge en app til Windows, men det er ikke nemt at finde en erstatning for alarmfunktionen (fundet på signal.h) ...


Sagen er, i Linux, når du indstiller alarmflagget som SIGALRM (hvis ikke fejlagtigt), hvad OS'et skal gøre er at udføre en funktion, når alarmen slukker.
Eksempel:


signal(SIGALRM, myfunc);
alarm (2);


Hvad der skal ske på dette eksempel er, at OS'et skal kalde funktionen myfunc hvert andet sekund (i Windows vil det nok være milisekunder, men vær opmærksom på detaljerne lige nu).


Jeg har i nogen tid søgt hvordan man gør det samme på windows (kun ved hjælp af windows.h atm), men jeg kan ikke finde en erstatning for det (søgte tusindvis af gange på msdn), og i Windows er der ingen SIGALRM flag på signalet ....


Hvad kan jeg bruge i C til at gøre den samme adfærd som alarmen med SIGALRM-flag? (Med andre ord en funktion, der gør det muligt at udføre en anden funktion ved hjælp af en alarm eller lignende).

Bedste reference


Tjek MSDN for timeSetEvent. Det er ikke helt det samme som alarm, men kan være tæt nok.

Andre referencer 1


Brug af alarm/SIGALRM er ikke en sikker måde at 'køre en funktion på et givet tidspunkt', fordi funktionen påberåbes i en signalhåndteringskontekst, hvor brug af næsten alle biblioteksfunktioner er usikkert. Virkelig den eneste gode brug, jeg kender til SIGALRM, er at oprette en do-nothing signalhåndterer med sigaction for at afbryde systemopkald, så et systemopkald du forventer kan hænge, ​​afbrydes med EINTR .


Hvis du vil udføre en bestemt opgave N sekunder fra nu, er den sikreste måde at gøre det på, start en ny tråd, der sover N sekunder, og udfører opgaven. Dette skal fungere på ethvert operativsystem med tråde.


Windows har også sin egen slags timerhændelser, der kan leveres via Windows-meddelelsessystemet, men ved at bruge dem vil din kode blive meget mere Windows-centreret.