קליטה בTHREAD. - תכנות - HWzone פורומים
עבור לתוכן
  • צור חשבון

קליטה בTHREAD.


Ghosthunter

Recommended Posts

אני מנסה לקלוט ע"י CIN לתוך משתנה בתראד חדש שעשיתי, אך אני לא מצליח.

כאילו צריך להגיד לCIN שיקלוט מהתראד הזה, מכיוון שאחרי שאני יוצא מהתוכנית, הוא רושם לי אחרי הc:\> (התחלתי אותו מהדוס) את מה שרשמתי כשהתוכנית פעלה.

תודה רבה.

קישור לתוכן
שתף באתרים אחרים

האמת היא שבדקתי את הקוד שלי 100 פעמים עד שמצאתי את הטעות.

רק טיפש כמוני יכול לעשות לולאה שרצה כל עוד TRUE, ורק אחר כך לקרוא לפונ שיוצרת את התראד החדש.

עכשיו יש לי שאלה אחרת:

אני קורא ככה:

_beginthread(get_text, 0, NULL);

לפונ get_text שנמצאת באותו CLASS שאני קורא לו, וזה לא עובד.

כשאני הפעלתי את זה כששניהם מחוץ לאותו CLASS זה עובד.

הוא נותן לי בעיה:

'_beginthread' : cannot convert parameter 1 from 'void *(void *)' to 'void (__cdecl *)(void *)'
None of the functions with this name in scope match the target type

אין אני יכול לפתור את זה?

קישור לתוכן
שתף באתרים אחרים

כמובן, יש בעיה עם פויינטרים לmember functions. אתה לא אמור לעשות את זה, בגלל שmember function הוא חסר משמעות בלי הthis pointer שלו.

מן הסתם, בשעת יצירת thread מועבר גם context (הפרמטר void *) שאפשר לומר שהוא הthis, אבל לקומפיילר זה לא אכפת.

אתה יכול להתחכם, אבל עדיף שלא.

מה שצריך לעשות במצב כזה הוא ליצור עוד פונקציית ביניים, שתעשה את הדבר הבא: היא תיקח את הcontext שמועבר אליה (הvoid *), תעשה לו cast לאובייקט מהסוג המתאים ואז תקרא ישירות לפונקציית ההרצה של האובייקט.

פירוט בהודעה הבאה.

קישור לתוכן
שתף באתרים אחרים



/* your CLASS equivalent */
class usb_t
{
public:
void thread_connect_midi_device( void );

} usb;

/* actual thread function */
void usb_t::connect_midi_device( void )
{
while( 1 )
{
printf( "i am a st00pid n00b\n" );
}
}

/* static wrapper which is compatible with the thread creation function */
void thread_wrapper( void * thread_context )
{
usb_t * cptr;

/* cast the (void *) context into the object */
cptr = (usb_t *) thread_context;

/* run the main thread function */
cptr->connect_midi_device();
}

_beginthread( thread_wrapper, 0, (void *) &usb );

/code]

That's the spirit, at least, I can't be held for any typos or other minor errors, or errors of any kind, providing tech support at 3:48am

קישור לתוכן
שתף באתרים אחרים

למה זה כזה איכסה?

אני צריך ליצור פונ כזו לכל פונ מתוך הקלאס שיש לי כדי ליצור תראד חדש ולהפעיל אותה בו?

או שיש לי אפשרות לשלוח גם את שם הפונ, ואת סוג הCLASS שלי, כדי ליצור פונ "כללית" יותר.

אם אני רוצה ליצור תראד חדש מאותו CLASS\ אני עדיין עושה אותו דבר?

(4 בלילה ואני לא חושב טוב, אבל משום מה נראה לי שיהייה שם LOOP).

קישור לתוכן
שתף באתרים אחרים

בדיוק. אתה חייב פונקציית מעטפת כזו בשביל כל פונקציה בclass שאתה רוצה להריץ כthread. או שתעבור לכתוב בC...  ;D

עוד דבר שאפשר לעשות זה פונקציה סטטית בתוך הקלאס - כך היא נקראת בלי הthis.

תעשה פונקציה סטטית, ותקרא לה דרך beginthread. אבל אז, כנראה שתצטרך להוסיף לקבצים שלך, בהתחלה, את ה


#ifndef __cplusplus
extern "C"
{

<code>

#ifndef __cplusplus
}
#endif

הידוע לשמצה.

קישור לתוכן
שתף באתרים אחרים

אז איך מפתחים אמיתיים מסדרים את הבעיה?

הם יוצרים מלא פונ כאלו.

אני אגיד לך מה ניסיתי לעשות, אולי אני לא עושה משהו טוב.

הרעיון של התוכנית הוא להעביר הודעות לשרת מסויים(חד כיווני).

גם בשרת וגם בקליינט יש את התוכנית שלי רצה(כאילו דההה).

יצרתי קלאס לשרת, וקלאס אחד לקליינט כדי שזה יהייה יותר קרוב לC++.

בהתחלה זה היה עם פרוצדורות, וזה עבד לי טוב, אבל עכשיו כשעברתי לקלאסים זה לא עובד לי.

האם ככה מתכנתים נכון?

קישור לתוכן
שתף באתרים אחרים

לא ברור לי, מההסבר שלך, איפה ואיך אתה מנסה להשתמש בthreads.

יצא לי לכתוב קוד בC++ שמשתמש בthreads, עשיתי בדיוק את מה שתיארתי למעלה - כתבתי wrappers חיצוניים.

זה לא בעיה, הרי תמיד אתה צריך להריץ רק פונקציה אחת של האובייקט כthread. אם יש לך שני אובייקטים שצריכים לרוץ כthreads, זה בסך הכל שתי פונקציות.

יכול להיות שאתה עושה משהו יותר בסיסי לא כמו שצריך - תפרט קצת יותר.

קישור לתוכן
שתף באתרים אחרים

יש לי 2 פונ במחלקה אחת שצריכים לרוץ בתראד נוסף, ועוד פונ אחת במחלקה אחרת.

אם ככה נהוג לעשות את זה, אז אני אעשה את זה כך.

זה פשוט נראה לי עבודה יותר מידי שחורה...

ומה עושים עם הפונ שלי בPRIVATE?

אני לא רוצה לתת למישהו אחר אפשרות להפעיל את זה בתראד נוסף, אלא רק לאובייקט עצמו.

ככה זה נראה:


#ifndef __CCLIENT_H
#define __CCLIENT_H

#include <iostream.h>
#include <process.h>
#include "cList.h"
#include "csocket.h"
#include "define.h"

class cClient
{
private:
CSocket *pSocket;

void client();
void *get_text(void *arg);
public:
cClient(char * szRemoteMachine, int iPort);
~cClient();
};

void get_text_wrapper(void *thread_context);

#endif //__CCLIENT_H

ואני רוצה מתוך client להפעיל את get_text בתראד נוסף.

כפי שאתה רואה, שניהם בPRIVATE, ואם אני שולח את GET_TEXT לפונ אחרת, אז היא לא יכולה להפעיל את אותה.

יש דרך לסדר את זה?

צריך להגדיר כFRIEND?

אני אנסה...

קישור לתוכן
שתף באתרים אחרים

תגדיר את get_text כפונקציה static שמקבלת void *.

תריץ אותה כthread מתוך client, ותעביר לה כארגומנט את this, אחרי cast לvoid *, ככה:


cClient::client()
{
    _beginthread(cClient::get_text, 0, (void *) this );
}

cClient::get_text ( void * context )
{
    cClient * this;

    this = (cClient *) context;

...
}

קישור לתוכן
שתף באתרים אחרים

ארכיון

דיון זה הועבר לארכיון ולא ניתן להוסיף בו תגובות חדשות.

×
  • צור חדש...