كيف يمكنني صحيح مسبل المؤشر من الفراغ* إلى TMemo* في C++Builder2009?

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

سؤال

أنا أكتب متعددة مأخذ موضوع الدردشة في C++Builder 2009.
فمن شبه كامل وفقا لما أريد القيام به ولكن لدي مشكلة صغيرة.أحتاج لتمرير TMemo* المؤشر إلى CreateThread WinAPI وظيفة التي upcasts إلى الفراغ*.

حاول هذه الطريقة:

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

ثم في NetThread وظيفة ،

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

لكنه لم يعمل:(

السؤال هو كيف يمكنني حقا مسبل بشكل صحيح حتى يمكنني استخدام بلدي مذكرة عنصر في هذا الموضوع ؟

هل كانت مفيدة؟

المحلول

الاتصال:

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

ما يحدث هنا هو أن أي مؤشر يمكنك تمرير المعلمة الثالثة يتم تحويل السيارات إلى الفراغ مؤشر (أو في WinTerms LPVOID).لا بأس لا يتغير فإنه يفقد فقط نوع من المعلومات مثل نظام لا يعرف أي شيء عن وجوه الخاص بك.

موضوع جديد نقطة البداية:

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

بمجرد بداية الخيط طريقة يسمى.مجرد تحويل الفراغ المؤشر مرة أخرى إلى النوع الصحيح و يجب أن تكون قادرا على البدء في استخدامه مرة أخرى.

فقط لتوضيح المفاهيم الخاطئة الأخرى.

A التعامل مع المؤشر.
و هل يمكن أن يكون مرت عليه كما المعلمة إلى NetThread().

مؤشر هو مؤشر إلى مؤشر بموجب نظام مراقبة النقاط التي في وجوه تستخدمه.فلماذا مزدوجة المراوغة.فإنه يسمح النظام لنقل الكائن (و تحديث المؤشر) دون إيجاد جميع أصحاب الكائن.أصحاب جميع مقابض نقطة في المؤشر الذي تم تحديث فقط.

هو قديمة الطراز في علوم الكمبيوتر مفهوم استخدامها بشكل غير منتظم في أجهزة الكمبيوتر الحديثة بسبب OS/الأجهزة القدرة على مبادلة الذاكرة الرئيسية في التخزين الثانوي.ولكن في بعض الموارد أنها لا تزال مفيدة.في الوقت الحاضر عندما يعالج مطلوبة أنها مخفية داخل الكائنات بعيدا عن المستخدم.

نصائح أخرى

يرجى نفهم أن مقبض لا مؤشر, ولكن مفهوم Win32 API.لذا فإن أول خط يلقي LPVOID للتعامل مع - هذا هو الصحيح ، كما المعلمة من الخيط الروتينية حقا هو التعامل مع (xxx).ومع ذلك, ثم يمضي تحويل مقبض MyMemo الكائن ؛ هذا يعامل بت في التعامل معها كما لو أنها ستشكل عنوان - التي ليست.

السطر الثاني يقوم بالضبط نفس التحويل - فإنه يعامل التعامل معها كما لو كانت المؤشر مباشرة.

أتساءل لماذا لا يمر MemoChat نفسه إلى الموضوع:

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

وهذا هو أكثر في محاولة لتوضيح مقبض مقابل شيء المؤشر، لأنني لا أعتقد أن مارتن لديها بالضبط الحق.

وA "المؤشر إلى مؤشر" ما يسمى بالفعل التعامل معها، وهو نهج CS المشترك للسماح نظام التشغيل لنقل جسديا كتل الذاكرة المخصصة كومة حول دون المعرفة الصريحة من طبقة التطبيق، الذي يصل دائما لهم عبر يعالج. يعمل الكلاسيكية 68K ماك OS بهذه الطريقة. OS'es التي تعمل بهذه الطريقة تسمح عادة رمز المستخدم لتخصيص الذاكرة عن طريق مقابض وكذلك مباشرة قبالة كومة. ويستخدم هذا النهج على الأجهزة التي ليس لديها الأجهزة السليم إدارة الذاكرة.

ولكن هناك استخدامات أخرى لكلمة HANDLE التي تقترض بعض من التجريد من استخدام السابقة، ولكن مع تطبيقات مختلفة. مؤشرات مبهمة (مؤشرات إلى datastructures منها المستخدم ليس لديه المعرفة - PIMPL لغة) كما تسمى عادة مقابض.

وأيضا، والتعامل مع المدى يمكن استخدامها ببساطة للدلالة على "المرجعية" إلى كائن - ربما فهرس في صفيف. مقابض ملف يونكس (= اصفات الملف) هي خير مثال على ذلك. ستدين = 0، المعياري = 1، ...

وهكذا، أي من أعلاه هي مقابض API ويندوز؟ رأيت تقارير متضاربة. هذه الوثيقة يقول:

<اقتباس فقرة>   

وتتولى في Win32 أعداد تستخدم ل   تحديد الموارد أو النوافذ. هم   ليست مؤشرات أو مؤشرات ل   المؤشرات. نفكر بها أرقام الهوية.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top