Unter Windows für MIKRO-Sekunden warten?
-
hallo,
ich code ein programm wo sleep(1); net mehr ausreicht und ich gerne für mikrosekunden statt für millisekunden das programm anhalten möchte...
gibts da irgenwas?
usleep funkt net da ich unter windows arbeite.
mein compiler is Dev-Cpp
danke für jede hilfe
lg papanoah
-
Schau dir mal QueryPerformanceCounter()/QueryPerformanceFrequency() aus der WinAPI an. Hat aber nichts mehr mit ANSI-C zu tun.
MfG SideWinder
-
SideWinder schrieb:
Schau dir mal QueryPerformanceCounter()/QueryPerformanceFrequency() aus der WinAPI an. Hat aber nichts mehr mit ANSI-C zu tun.
MfG SideWinder
Die Funktionen sind zum Zeitmessen und nicht zum Warten.
-
multimedia timer schrieb:
SideWinder schrieb:
Schau dir mal QueryPerformanceCounter()/QueryPerformanceFrequency() aus der WinAPI an. Hat aber nichts mehr mit ANSI-C zu tun.
MfG SideWinder
Die Funktionen sind zum Zeitmessen und nicht zum Warten.
Das ist richtig, aber daraus kann man sich bequem Warte-Funktionen schreiben.
-
Dann wird das aber ein Busy-Waiting.
-
multimedia timer schrieb:
Dann wird das aber ein Busy-Waiting.
Unter Windows wird sich kaum was anderes finden ohne direkte HW-Unterstützung.
MfG SideWinder
-
SideWinder schrieb:
multimedia timer schrieb:
Dann wird das aber ein Busy-Waiting.
Unter Windows wird sich kaum was anderes finden ohne direkte HW-Unterstützung.
MfG SideWinder
Was ist mit CreateWaitableTimer(), SetWaitableTimer() und WaitForSingleObject()?
-
multimedia timer schrieb:
Dann wird das aber ein Busy-Waiting.
Aber nicht so busy, wie man denken könnte. Schonmal was von Sleep(0) oder SwitchToThread() gehört?
-
Dieser Thread wurde von Moderator/in c.rackwitz aus dem Forum ANSI C in das Forum WinAPI verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.
-
Man beachte das Windows kein Echtzeit (Realtime) Betriebssystem ist!
Wenn Dein Thread gerade gescheduled wird und Du dann für einige uS warten willst, geht dies nur über einen Busy-Wait (meine Empfehlung ist dies via rdtsc).
Wenn Du ein Sleep(0) machst, und ein anderer Thread auch lauffähig ist, kann es sein, dass Du erst wieder nach 30-50 ms dran kommst...
Wenn Du ein Sleep(1) machst, dann kommst Du i.d.R. erst wieder beim nächsten Timer-Interrupt dran (ca. 10-15 ms).
-
Warum überhaupt warten? Mach doch ununterbrochen deine Aktion.
-
so, also danke erstmal für die antworten
@Jochen Kalmbach: wie würde das denn gehen mit rdtsc??
@msa: ich muss einfach warten ansonst werden variablen falsch zugeordnet usw.
lg papanoah
-
Papa_Noah schrieb:
ich muss einfach warten ansonst werden variablen falsch zugeordnet usw.
Dann hast Du aber ein vollkommen falsches Design!!! Synchronisation macht man nicht durch Zeit, sondern durch Synchronisations-Objekte...
PS: Ich würde doch QueryPerformanceCounter nehmen und nicht rtdsc...
-
also wenn du mikro secunds warten willst oder was du auch immer machen willst dann nimm doch einfach dis hier:
#include <iostream>
using namespace std;void wait (int mikroseconds )
{
clock_t endwait;
endwait = clock() + mikroseconds *CLK_TCK ;
while (clock() > endwait) {}
}int main()
{
int n;
cout << "hallo\n";
for (n=5000; n>0; n--)
{
printf ("%d\n", n);
wait (1);
}
cin.get();
return 0;
}das is zwar jetzt nenn countdown aber du kannst halt immer wenn gewartet werden soll: wait ('deine mikrosekunden'); machen...
gruß
-
vielleicht hilft auch 'NtDelayExecution'. ich glaub das hat das 'ne bessere auflösung als millisekunden. aber ich bezweifle mal auch, dass das mikrosekundengenau funzt.
-
big juli schrieb:
void wait (int mikroseconds )
{
clock_t endwait;
endwait = clock() + mikroseconds *CLK_TCK ;
while (clock() > endwait) {}
}Die Funktion nimmt "Sekunden" entgegen, aber keine Mikro-Sekunden! und der Vergleich ist auch noch falsch ">" anstelle von "<"...
-
net schrieb:
vielleicht hilft auch 'NtDelayExecution'.
Ist aber undokumentiert...
http://undocumented.ntinternals.net/UserMode/Undocumented Functions/NT Objects/Thread/NtDelayExecution.htmlDas beste ist immer noch eine vernünftige Synchronisation:
http://msdn.microsoft.com/library/en-us/dllproc/base/using_synchronization.aspEine Wartefunktion könnte so aussehen:
LARGE_INTEGER s_liFreq = {0}; void wait (int mikroseconds ) { if (s_liFreq.QuadPart == 0) QueryPerformanceFrequency(&s_liFreq); LARGE_INTEGER liStart; LARGE_INTEGER liGoal; QueryPerformanceCounter(&liStart); liGoal.QuadPart = liStart.QuadPart; liGoal.QuadPart += (s_liFreq.QuadPart * mikroseconds) / 1000000; LARGE_INTEGER liAct; do { QueryPerformanceCounter(&liAct); if (liStart.QuadPart > liAct.QuadPart) break; // overflow!!! } while(liAct.QuadPart < liGoal.QuadPart); }
Aber ACHTUNG:
- Es kann keine Garantie übernommen werden, dass nicht doch länger gewartet wird als man angibt; dies hängt u.a. damit zusammen, dass es teilweise einen Switch in der Kernel-Mode gibt...
-
Wie gesagt, wenn Variablen falsch zugeordnet werden würde ich überhaupt ein anderes Design vorschlagen. Lass lieber mal deinen Code sehen und wir retten dich vor dem totalen Untergang auf schnelleren Prozessoren.
MfG SideWinder
-
also hier ist der code, es ist ein kleiner portscanner
wenn ihr was net versteht(is öfter bei meinen codes :D) dann meldet euch
danke
lg papanoah/* Name: Portscanner Copyright: - Author: papa Date: 28.12.05 12:23 Description: Simpler Portscanner */ #include <stdio.h> #include <stdlib.h> #include <windows.h> #include <winsock2.h> char ip[30]; int anfangsport, endport, threads, threadscount=0, anzahl, count=0, prozent; //Funktion zum Scannen (Jede Menge Fach-Jagon) void scan (void *dummy) { int funktionport; long rc; SOCKET s; SOCKADDR_IN addr; WSADATA wsa; //socket erstellen funktionport = anfangsport; rc=WSAStartup(MAKEWORD(2,0),&wsa); //socket erstellen s=socket(AF_INET,SOCK_STREAM,0); //client socket erstellen memset(&addr,0,sizeof(SOCKADDR_IN)); // zuerst alles auf 0 setzten addr.sin_family=AF_INET; addr.sin_port=htons(funktionport); //port addr.sin_addr.s_addr=inet_addr(ip); //zielrechner rc=connect(s,(SOCKADDR*)&addr,sizeof(SOCKADDR)); //Offene Ports ausgeben if(rc != SOCKET_ERROR) { printf ("Port %i ist offen.\n", funktionport); } //Socket schliessen closesocket(s); WSACleanup(); threadscount--; _endthread(); } int main(int argc, char *argv[]) { //ip eingeben printf ("Geben Sie die zu scannende IP ein: "); gets (ip); if (strlen(ip) > 15 || strlen(ip) < 7) { printf ("Unbekanntes IP Format.\n\n"); system("PAUSE"); exit(0); } //anfangsport eingeben printf ("\nGeben Sie den Anfangs-Port ein: "); scanf ("%i", &anfangsport); if (anfangsport > 65535 || anfangsport < 1) { printf ("Unbekannter Port.\n\n"); system("PAUSE"); exit(0); } //endport eingeben printf ("\nGeben Sie den End-Port ein: "); scanf ("%i", &endport); if (endport < anfangsport || endport > 65535) { printf ("Unbekannter Port."); system("PAUSE"); exit(0); } //threads eingeben printf ("\nGeben Sie die Anzahl der Threads ein: "); scanf ("%i", &threads); if (threads > 1000) { printf ("Zu viele Threads."); system("PAUSE"); exit(0); } //anzahl der scans ab anfangsport berechnen anzahl = endport - anfangsport; //Threads starten mit for-Schleife for (count=0; count <= anzahl; count++) { if (threadscount < threads) { _beginthread (scan, 0, NULL); //--------------------------------HIER ist das 1. sleep sleep(1); threadscount++; anfangsport++; } else { count--; //--------------------------------HIER ist das 2. sleep sleep(1); } } sleep (1000); printf ("\nDone...\n\n"); system("PAUSE"); return 0; }
-
Ein Port-Scanner arbeitet normal mit Raw-Sockets und sendet einfach ein SYNC... naja... siehe diverse Projekte auf sourceforge.net
Und warum Du ein Sleep brauchst hab ich immer noch nicht verstanden... Du musst doch einfach nur warten, bis alle Threads sich beendet haben... dazu kannst Du _beginthredex nehmen und WaitForMultipleObjects (mehrmals wenn > 64 handles).