Wie kann ich niedergeschlagenen richtig die Zeiger von void * zu TMemo * in C ++ Builder2009?

StackOverflow https://stackoverflow.com/questions/274841

Frage

I Multi-Thread-Socket-Chat in C ++ Builder 2009 schreibe
Es ist fast vollständig in Übereinstimmung mit dem, was ich tun muß, aber ich habe ein kleines Problem. Ich brauche die TMemo * Zeiger in Create WinAPI Funktion zu übergeben, die es upcasts void *.

Ich habe versucht auf diese Weise:

HANDLE xxx = MemoChat->Handle;
hNetThread = CreateThread(NULL, 0, NetThread, xxx, 0, &dwNetThreadId);
//...

und dann, in NetThread Funktion,

TMemo* MyMemo((HANDLE)lpParam);
TMemo* MyMemo((TMemo*)lpParam);

, aber es didn `t Arbeit: (

Die Frage ist, wie ich es wirklich richtig niedergeschlagenes kann, so kann ich in diesem neuen Thread meine Memo-Komponente verwenden?

War es hilfreich?

Lösung

Call:

TMemo*     MemoChat   = // You defined that somewhere I assume
HANDLE     hNetThread = CreateThread(NULL, 0, NetThread, MemoChat, 0, &dwNetThreadId);

Was hier passiert, ist, dass jeder Zeiger Sie als der dritte Parameter übergeben wird automatisch in einen void-Zeiger umgewandelt werden (oder in WinTerms LPVOID). Das ist in Ordnung es nicht, es ändert es verliert nur die Typinformationen, da das System nicht etwas über das Objekt nicht kennt.

Der neue Thema Startpunkt:

DWORD NetThread(LPVOID lpParameter)
{
    TMemo*   MemoChat   = reinterpret_cast<TMemo*>(lpParameter);
    // Do your thread stuff here.
}

Nachdem der Thread-Start-Methode aufgerufen wird. konvertieren Sie einfach die void-Zeiger wieder in die richtige Art und Sie sollten wieder in Betrieb nehmen starten können.

Just zu klären, andere Missverständnisse.

A GRIFF ist ein Zeiger .
Und Sie es als Parameter an die NetThread bestanden haben könnte ().

Ein Handle ist ein Zeiger unter Systemsteuerung auf Zeiger, die auf dem Objekt zeigt, das Sie verwenden. Warum also die doppelte indirection. Es ermöglicht es das System, das Objekt zu bewegen (und dessen Zeiger zu aktualisieren), ohne dass alle Besitzer des Objekts zu finden. Die Besitzer haben alle Griffe, die am Zeiger verweisen, die gerade aktualisiert wurde.

Es ist ein altmodisches Informatik Konzept, das wegen der OS / Hardware Fähigkeit zu tauschen Hauptspeicher in den Sekundärspeicher selten in modernen Computern verwendet wird. aber für bestimmte Ressource sind sie immer noch nützlich. Heutzutage werden, wenn Griffe benötigt sie in Objekte versteckt sind vom Benutzer weg.

Andere Tipps

Bitte haben Sie Verständnis, dass ein Griff nicht ein Zeiger, sondern ein Konzept des Win32-API. So ist die erste Linie wirft die LPVOID zu handhaben - dies richtig ist, da die Parameter der Faden Routine wirklich als Griff gegeben ist (xxx). Allerdings geht es dann auf den Griff zu einem MyMemo Objekt umzuwandeln; Diese behandelt die Bits in den Griff, als ob sie eine Adresse bilden würden -. was sie nicht sind

Die zweite Zeile macht genau die gleiche Umwandlung - es behandelt einen Griff, als ob es einen Zeiger direkt war

.

Ich frage mich, warum Sie nicht MemoChat sich auf das Gewinde sind vorbei:

hNetThread = CreateThread(NULL, 0, NetThread, MemoChat, 0, &dwNetThreadId);

Das ist mehr zu versuchen und den Griff gegen Zeiger Sache zu klären, weil ich nicht glaube, Martin es genau richtig ist.

Ein „Zeiger auf einen Zeiger“ ist in der Tat ein Handle genannt und ist ein gemeinsamer CS Ansatz das Betriebssystem zu ermöglichen Heap zugewiesenen Speicherblocks um ohne explizite Kenntnis von einer Anwendungsschicht physisch zu bewegen, die immer greift sie über Griffe. Klassisches 68K Mac OS funktioniert auf diese Weise. OS'es, die normalerweise auf diese Weise arbeiten, erlaubt dem Anwender, Code-Speicher über Griffe sowie direkt aus dem Heap zu reservieren. Dieser Ansatz wird auf Maschinen verwendet, die richtige Speicher-Management-Hardware nicht hat.

Es gibt jedoch andere Verwendungen des Wortes handhaben, die den einen Teil der Abstraktion von der bisherigen Verwendung leihen, aber mit unterschiedlichen Implementierungen. Opaque Pointer (Zeiger auf Datenstrukturen, von denen der Benutzer keine Kenntnis hat - PIMPL Idiom) ist auch häufig GREIFT genannt.

Auch kann der Begriff GREIFT einfach eine „Referenz“ auf ein Objekt zu bezeichnen, verwendet werden - vielleicht einen Index in ein Array. Unix File Handles (= Datei-Deskriptoren) ist ein gutes Beispiel dafür. stdin = 0, stdout = 1, ...

Also, welche der oben genannten sind Windows-API-GREIFT? Ich habe widersprüchliche Berichte gesehen. Dieses Dokument sagt:

  

Griffe in Win32 sind die verwendeten Zahlen   identifizieren Ressourcen oder Fenster. Sie   sind keine Zeiger oder Zeiger auf   Zeiger. Betrachten Sie sie als ID-Nummern.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top