Zum Inhalt springen

paddy_de

Mitglieder
  • Gesamte Inhalte

    14
  • Benutzer seit

  • Letzter Besuch

  1. Hallo, ich weiß nicht genau, ob ich hier richtig bin bzw. ob mir hier jemand weiterhelfen kann. Bin momentan dabei ein bißchen mit SQLite rumzuspielen. Dabei hab ich nun folgendes Problem. Ich verwende eine Virtual Table habe dazu ein entsprechendes Modul angelegt und der Lesezugriff auf meine Daten funkioniert auch einwandfrei. Nun möchte ich noch eine Transaction aufbauen sprich xBegin/xCommit/xRollback ansteuern. Jedoch habe ich keinerlei ahnung, wie ich da am besten vorgehe. Ich möchte nun die Daten, die ich temporär in eine virtual table eingelesen habe verändern bzw neue Daten hinzufügen und mit einen commit in meine Datei schreiben. Klingt warscheinlich ziemlich verwirrend, hoffe aber trotzdem das jemand mein Problem verstanden hat und sich damit auskennt. Falls der bisher vorhande Sourcecode benötigt wird einfach melden. Danke!
  2. paddy_de

    Introsort

    alles klar danke, dann weiß ich jetzt glaub ich, wie ich es hinbekomme!
  3. paddy_de

    Introsort

    ok das klingt losgisch, nur wie bekomme ich raus, wann die entsprechende Rekursionstiefe erreicht ist, um z.B. von quicksort auf heapsort zu wechseln? ich hab auch schon etwas code gefunden, wo genau das Problem behandelt wird, nur leider ist der code in Java geschrieben und das auf C umzusetzen klappt noch nicht so recht! ralphunden.net
  4. paddy_de

    Introsort

    ja ok das ist ja aber nur eine Vriablen Deklaration! Das Problem ist ganz einfach, dass ich nicht weiß, wie ich nun aus meinen beiden Sortierprogrammen einen Introsort baue. Habe auf zahlreichen Seiten gelesen, dass dieser in bestimmten Fällen schneller ist als die beiden oben beschriebenen, vorallem, wenn der worst case auftritt! Ich müsste ja nun irgendetwas um meine Programme herum programmieren, dass entscheidet, wann welche Sortiermethode verwendet werden soll. Und das ist genau mein Problem, wo ich nicht weiter komme, weil ich nicht weiß, wie ich das am besten machen soll, deshalb habe ich dieses Topic ins Forum gepostet. Vielleicht hat ja jemand schoneinmal soetwas gemacht und kann mir weiterhelfen, oder ein bißchen SourceCode zur verfügung stellen! danke!
  5. paddy_de

    Introsort

    hey also ich habe folgendes Problem! Ich möchte gerne Introsort in mein C-Programm implementieren! Im Internet per google suchmaschine findet man leider keine vernünftigen Beiträge dazu! Habe dort bisher nur was für Delphi oder Java gefunden und das wurde mir auch bei längerer Betrachtung nicht ganz schlüssig. Hoffe ihr könnt mir weiterhelfen! Ich poste gleich noch meine quciksort (3-Median-Methode) und meine heapsort funktionen, die ich ja eigentlich für meinen introsort verwenden können müsste. QuickSort: static void quickSort(NUMBERS_t *pNumbers, int iLeft, int iRight) { int i, j, iMedian; if (iRight > iLeft) { i = iLeft - 1; j = iRight; if (iRight - iLeft > 3) { iMedian = iLeft + (iRight - iLeft) / 2; if (pNumbers[iLeft].iRandom > pNumbers[iMedian].iRandom) swapp(&pNumbers[iLeft].sizeIndex, &pNumbers[iMedian].sizeIndex, &pNumbers[iLeft].iRandom, &pNumbers[iMedian].iRandom); if (pNumbers[iLeft].iRandom > pNumbers[iRight].iRandom) swapp(&pNumbers[iLeft].sizeIndex, &pNumbers[iRight].sizeIndex, &pNumbers[iLeft].iRandom, &pNumbers[iRight].iRandom); if (pNumbers[iRight].iRandom > pNumbers[iMedian].iRandom) swapp(&pNumbers[iRight].sizeIndex, &pNumbers[iMedian].sizeIndex, &pNumbers[iRight].iRandom, &pNumbers[iMedian].iRandom); } for ( ; ; ) { while(pNumbers[++i].iRandom < pNumbers[iRight].iRandom) ; while(pNumbers[--j].iRandom > pNumbers[iRight].iRandom) ; if (i >= j) break; swapp(&pNumbers[i].sizeIndex, &pNumbers[j].sizeIndex, &pNumbers[i].iRandom, &pNumbers[j].iRandom); } swapp(&pNumbers[i].sizeIndex, &pNumbers[iRight].sizeIndex, &pNumbers[i].iRandom, &pNumbers[iRight].iRandom); quickSort(pNumbers, iLeft, i-1); quickSort(pNumbers, i+1, iRight); } } static void swapp(size_t *sizeIndexA, size_t *sizeIndexB, int *iRandomA, int *iRandomB) { size_t sizeIndexTmp; int iRandomTmp; sizeIndexTmp = *sizeIndexA; iRandomTmp = *iRandomA; *sizeIndexA = *sizeIndexB; *iRandomA = *iRandomB; *sizeIndexB = sizeIndexTmp; *iRandomB = iRandomTmp; } HeapSort: static void heapSort(NUMBERS_t *pNumbers, int n) { int i; int iRandomTmp; size_t sizeIndexTmp; construction(pNumbers, n); for (i = 0; i < n; i++) printf("%d, %d\n", pNumbers[i].sizeIndex, pNumbers[i].iRandom); for (i = n-1; i >= 0; i--) { sizeIndexTmp = pNumbers[0].sizeIndex; iRandomTmp = pNumbers[0].iRandom; pNumbers[0] = pNumbers[i]; pNumbers[i].sizeIndex = sizeIndexTmp; pNumbers[i].iRandom = iRandomTmp; downHeap(pNumbers, i, 0); } } static void construction(NUMBERS_t *pNumbers, int n) { int i; i = n / 2 - 1; for (; i >= 0; i--) downHeap(pNumbers, n, i); } static void downHeap(NUMBERS_t *pNumbers, int n, int i) { int j; int iRandomTmp; size_t sizeIndexTmp; sizeIndexTmp = pNumbers[i].sizeIndex; iRandomTmp = pNumbers[i].iRandom; if (i < 0) return; while (i < n / 2) { j = i + i + 1; if (j + 1 < n && pNumbers[j].iRandom < pNumbers[j+1].iRandom) j++; if (iRandomTmp >= pNumbers[j].iRandom) break; pNumbers[i] = pNumbers[j]; i = j; } pNumbers[i].sizeIndex = sizeIndexTmp; pNumbers[i].iRandom = iRandomTmp; }
  6. alles klar danke dir!! mein google hat das nicht ausgespuckt! dann werd ich das wohl jetzt hinbekommen... danke für die reichliche Hilfe!
  7. Problem behoben...musste lediglich den charset auf Multibyte umstellen..! nun aber schon wieder ein neues problem hab gerade erfahren, dass der SMTP Server auf linux laufen soll...und DNSQuery ist ja leider eine Windows funktion! Hat jemand eine idee, ob es eine ähnliche Funktion für linux gibt? :confused::confused::confused:
  8. danke dir das hab ich verstanden und das soweit auch schon umgesetzt! hatte mich beim warten auf deine Antwort, obwohl sie so schnell kam mal selbst noch näher eingelesen und einfach mal drauf los probiert! Jetzt stehe ich jedoch vor folgendem Problem und zwar ist der erste Parameter in der DNSQuery Function ein PCWSTR! und ich möchte der Funktion ja einen String mitgeben also wie in deinem beispiel: "google.com" nun bekomme ich aber eine Fehlermeldung, dass er das nicht umwandeln kann! wenn ich dann den string caste oder ihn vorher deklariere und dann meinen string mit LPCTSTR(str) in die Variable schreibe, bekomme ich nur schrott...iwelche verwirrten zeichen und DNSQuery hat dann Fehler 123 Hoffe du kannst mir wieder weiterhelfen!
  9. ok das klingt vielversprechend, aber so recht verstanden hab ich nun nicht, was ich genau machen soll. Bin halt noch nicht so wirklich drin in dem Thema SMTP Server und vorallem beim verstehen von der msdn Hilfe! Kannst du mir vielleicht ein Beispiel geben, wie genau ich das machen muss? danke schonmal!
  10. Hallo Leutz...ich hab da mal ne dringende Frage und hoffe, dass ihr mir mal wieder helfen könnt! Beim HTTP Server hat das ja auch ganz gut geklappt! Naja auf jeden fall soll ich nun erstmal einen SMTP Server programmieren und bin soweit auch ganz gut vorangekommen! Nun mein Problem! Also ich bekomme die Nachricht von meinem Client (Outlook Express) auf meinen Server via SMTP Protokoll! Nun möchte ich die Mail natürlich von meinem Server an den entsprechenden Empfänger schicken! Dazu brauch ich ja den genauen Mailserver des jeweiligen Empfängers um ein Connect mit ihm herzustellen. Das Problem ist nun, dass ich ja nur die Domain habe, also das was in der E-Mail nach dem @ folgt, da fehlt mir ja noch der prefix und der ist von Empfänger zu Empfäner verschiedend. Lösung hatte ich ir jetzt gedacht ist ganz einfach sowas wir ein NSLookup machen, also über die MXRecords an die komplette DNS heranzukommen. Wenn ich NSLookup in der Windows Komandozeile öffne und dann MXRecord für z.B. gmx.de mache, dann bekomme ich die mailserver von gmx. Genau soetwas möchte ich in meinem C-Code machen! kennt da jemand vll eine bereits vorhandene Funktion? ich hab das bislang nichts gefunden und schon ne weile gesucht! Das einzige das ich bislang gefunden habe ist DnsQuery, aber da ist die msdn sehr verwirrend und ich weiß nicht ob ich das verwenden kann. Bitte um hilfe und ein beispiel wäre mehr als überragend!
  11. ok das hab ich mir schon gedacht...hab mir das auch alles schon durchgelesen, aber so wirklich weit bin ich damit noch nicht gekommen! naja aber danke auf jeden fall dür die schnelle Hilfe! ich werd mir dann wohl noch ein paar tage den kopf darüber zerbrechen! Hat vll schonmal jemand sowas ähnliches gemacht und kann mir ein bißchen beispielcode schicken oder so?
  12. ok...dann werde ich das wohl anders machen müssen. gibt es denn eine möglichkeit das grundprinzip umzusetzen, dass ich beim start des servers die 10 threads erstelle und sie dann nachher immer verwende und wieder weglege(pausieren, oder was auch immer), halt nur nicht mit suspend thread dann?
  13. Das hab ich gelesen ja und ich weiß auch, dass das nicht zu empfehlen ist es so zu machen. Mein chef möchte das aber gerne und daher suche ich nach einer lösung das trotzdem so zu machen. nur so langsam bin ich am verzweifeln, da ich keine geeignete lösung finde...!
  14. Ich hab ein Problem und zwar sitze ich gerade daran einen HTTP Server in "C" zu programmieren und da stellt sich natürlich früher oder später die aufgabe des Multithreadings mit Hilfe eines Threadpools. Genau an diesem Punkt bin ich nun auch angekommen und es stellt sich folgendes Problem: Die 10 Threads erstelle ich am Anfang als CREATE_SUSPEND und beim ersten aufruf für jeden der zehn Threads aktiviere ich diesen mit ResumeThread und schläfer ihn am Ende wieder mit SuspendThread ein. Das Problem ist nun jedoch, wenn jeder der zehn Threads einmal etwas zu tun hatte und somit schonmal durch ResumeThread aktiviert und durch SuspendThread wieder schlafen gelegt wurde, bleibt mein Server hengen und reagiert nicht mehr! Ich kann also einen Thread nicht mehrmals verwenden. Meine idee ist, dass ich einen Threadpool habe, den ich mit hilfe einer struktur aufbaue(linked list) und halt immer den ersten Thread benutze und ihn dann aus der linked list herausnehme! Wenn keine Threads mehr vorhanden sind, weil alle gerade verwendet werden, wird 30 sec gewartet. ich hoffe es kann mir jemand weiterhelfen, bin schon ziemlich am verzweifeln! Danke schonmal! Hier noch ein bissl Sourcecode: struct vom Threadpool: typedef struct THREADPOOL_s { LPDWORD wThreadID; CRITICAL_SECTION csectionAccept; HANDLE hThread; SOCKET sdAccept; fd_set rfds; bool bStopRunning; MYSQL *pMySQL; //! THREADPOOL_s *pThreadNext; } THREADPOOL_t; init ThreadPool: pStart_T = (THREADPOOL_t*) malloc(sizeof(THREADPOOL_t)); if (pStart_T == NULL) return -1; memset(pStart_T, 0, sizeof(THREADPOOL_t)); pStart_T->hThread = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)pfnThreadMessage, pStart_T, CREATE_SUSPENDED, pStart_T->wThreadID); if (pStart_T->hThread == NULL) { printf("errorcode: %d\n", GetLastError()); cleanup(pStart_M, NULL); free(pStart_T); printf("Cannot create Thread!\n"); return -1; } pTmp_T = pStart_T; for (i = 0; i < 10; i++) { pNew_T = (THREADPOOL_t *)malloc(sizeof(THREADPOOL_t)); if (pNew_T == NULL) { cleanup(pStart_M, pStart_T); return -1; } memset(pNew_T, 0, sizeof(THREADPOOL_t)); pNew_T->hThread = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)pfnThreadMessage, pNew_T, CREATE_SUSPENDED, pNew_T->wThreadID); if (pNew_T->hThread == NULL) { cleanup(pNew_M, pNew_T); printf("Cannot create Thread!\n"); return -1; } pTmp_T->pThreadNext = pNew_T; pTmp_T = pNew_T; } benutzen des Threads: do { if (listen(sdListen, MAX_SERVER_CONNECTIONS) == -1) { printf("Error listen()\r\n"); continue; } pThread = allocThreads(); if (pThread->hThread == NULL) { //deleteMessage(pThread); free(pThread); printf("No Threads are available!\n"); } else { pThread->sdAccept = accept(sdListen, NULL, NULL); if (pThread->sdAccept == -1) { releaseThread(pThread); printf("connection failed! socket\r\n"); continue; } dwRet = ResumeThread(pThread->hThread); if (dwRet == -1) { printf("errorcode: %d\n", GetLastError()); //deleteMessage(pThread); free(pThread); printf("Cannot resume Thread!\n"); releaseThread(pThread); } } } while (1); alloc thread funktion: static THREADPOOL_t* allocThreads() { THREADPOOL_t *pActive, *pTMP; mutexlock(true); pTMP = pFirst_T; if (pTMP != NULL) { pActive = pTMP; pFirst_T = pTMP->pThreadNext; mutexlock(false); return pActive; } else { mutexlock(false); return NULL; } } thread hat seine aufgabe erledigt: if (recvCommand(pThread) == 0) { iMySQLControl = 0; if (shutdown(pThread->sdAccept, 0) != 0) printf("shutdown-error(M)!\r\n"); closesocket(pThread->sdAccept); killmutex(pThread); //deleteMessage(pThread); //free(pThread); printf("Connection: closed\r\n\r\n\r\n"); releaseThread(pThread); return (void *) -1; } zu guter letzt die release Thread Funktion: void releaseThread(THREADPOOL_t *pThread) { THREADPOOL_t *pTMP; DWORD dwRet; mutexlock(true); if (pFirst_T != NULL) { pTMP = pFirst_T; while (pTMP->pThreadNext != NULL) pTMP = pTMP->pThreadNext; pTMP->pThreadNext = pThread; pTMP->pThreadNext->pThreadNext = NULL; } else { pFirst_T = pThread; pFirst_T->pThreadNext = NULL; } mutexlock(false); dwRet = SuspendThread(pThread->hThread); if (dwRet == -1) { printf("errorcode: %d\n", GetLastError()); exit(0); } }

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...