Ghosthunter פורסם 2005 באוגוסט 1 Share פורסם 2005 באוגוסט 1 אני מנסה לקלוט ע"י CIN לתוך משתנה בתראד חדש שעשיתי, אך אני לא מצליח.כאילו צריך להגיד לCIN שיקלוט מהתראד הזה, מכיוון שאחרי שאני יוצא מהתוכנית, הוא רושם לי אחרי הc:\> (התחלתי אותו מהדוס) את מה שרשמתי כשהתוכנית פעלה.תודה רבה. קישור לתוכן שתף באתרים אחרים More sharing options...
SamurAchzar פורסם 2005 באוגוסט 1 Share פורסם 2005 באוגוסט 1 זה מעניין - לא שיש לי רקע כלשהו בתכנות Windows, אבל כשאתה יוצר thread, הוא יורש את הdescriptors שלו (כולל stdin כמובן) מתוך הProcess בו הוא נוצר. תוכל להעלות הנה את הקוד? קישור לתוכן שתף באתרים אחרים More sharing options...
Ghosthunter פורסם 2005 באוגוסט 2 מחבר Share פורסם 2005 באוגוסט 2 האמת היא שבדקתי את הקוד שלי 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אין אני יכול לפתור את זה? קישור לתוכן שתף באתרים אחרים More sharing options...
SamurAchzar פורסם 2005 באוגוסט 2 Share פורסם 2005 באוגוסט 2 כמובן, יש בעיה עם פויינטרים לmember functions. אתה לא אמור לעשות את זה, בגלל שmember function הוא חסר משמעות בלי הthis pointer שלו.מן הסתם, בשעת יצירת thread מועבר גם context (הפרמטר void *) שאפשר לומר שהוא הthis, אבל לקומפיילר זה לא אכפת.אתה יכול להתחכם, אבל עדיף שלא.מה שצריך לעשות במצב כזה הוא ליצור עוד פונקציית ביניים, שתעשה את הדבר הבא: היא תיקח את הcontext שמועבר אליה (הvoid *), תעשה לו cast לאובייקט מהסוג המתאים ואז תקרא ישירות לפונקציית ההרצה של האובייקט.פירוט בהודעה הבאה. קישור לתוכן שתף באתרים אחרים More sharing options...
SamurAchzar פורסם 2005 באוגוסט 2 Share פורסם 2005 באוגוסט 2 /* 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 קישור לתוכן שתף באתרים אחרים More sharing options...
Ghosthunter פורסם 2005 באוגוסט 2 מחבר Share פורסם 2005 באוגוסט 2 למה זה כזה איכסה?אני צריך ליצור פונ כזו לכל פונ מתוך הקלאס שיש לי כדי ליצור תראד חדש ולהפעיל אותה בו?או שיש לי אפשרות לשלוח גם את שם הפונ, ואת סוג הCLASS שלי, כדי ליצור פונ "כללית" יותר.אם אני רוצה ליצור תראד חדש מאותו CLASS\ אני עדיין עושה אותו דבר?(4 בלילה ואני לא חושב טוב, אבל משום מה נראה לי שיהייה שם LOOP). קישור לתוכן שתף באתרים אחרים More sharing options...
SamurAchzar פורסם 2005 באוגוסט 2 Share פורסם 2005 באוגוסט 2 בדיוק. אתה חייב פונקציית מעטפת כזו בשביל כל פונקציה בclass שאתה רוצה להריץ כthread. או שתעבור לכתוב בC... ;Dעוד דבר שאפשר לעשות זה פונקציה סטטית בתוך הקלאס - כך היא נקראת בלי הthis.תעשה פונקציה סטטית, ותקרא לה דרך beginthread. אבל אז, כנראה שתצטרך להוסיף לקבצים שלך, בהתחלה, את ה#ifndef __cplusplusextern "C" {<code>#ifndef __cplusplus}#endifהידוע לשמצה. קישור לתוכן שתף באתרים אחרים More sharing options...
Ghosthunter פורסם 2005 באוגוסט 2 מחבר Share פורסם 2005 באוגוסט 2 אז איך מפתחים אמיתיים מסדרים את הבעיה?הם יוצרים מלא פונ כאלו.אני אגיד לך מה ניסיתי לעשות, אולי אני לא עושה משהו טוב.הרעיון של התוכנית הוא להעביר הודעות לשרת מסויים(חד כיווני).גם בשרת וגם בקליינט יש את התוכנית שלי רצה(כאילו דההה).יצרתי קלאס לשרת, וקלאס אחד לקליינט כדי שזה יהייה יותר קרוב לC++.בהתחלה זה היה עם פרוצדורות, וזה עבד לי טוב, אבל עכשיו כשעברתי לקלאסים זה לא עובד לי.האם ככה מתכנתים נכון? קישור לתוכן שתף באתרים אחרים More sharing options...
SamurAchzar פורסם 2005 באוגוסט 2 Share פורסם 2005 באוגוסט 2 לא ברור לי, מההסבר שלך, איפה ואיך אתה מנסה להשתמש בthreads.יצא לי לכתוב קוד בC++ שמשתמש בthreads, עשיתי בדיוק את מה שתיארתי למעלה - כתבתי wrappers חיצוניים.זה לא בעיה, הרי תמיד אתה צריך להריץ רק פונקציה אחת של האובייקט כthread. אם יש לך שני אובייקטים שצריכים לרוץ כthreads, זה בסך הכל שתי פונקציות.יכול להיות שאתה עושה משהו יותר בסיסי לא כמו שצריך - תפרט קצת יותר. קישור לתוכן שתף באתרים אחרים More sharing options...
Ghosthunter פורסם 2005 באוגוסט 2 מחבר Share פורסם 2005 באוגוסט 2 יש לי 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?אני אנסה... קישור לתוכן שתף באתרים אחרים More sharing options...
SamurAchzar פורסם 2005 באוגוסט 2 Share פורסם 2005 באוגוסט 2 תגדיר את 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;...} קישור לתוכן שתף באתרים אחרים More sharing options...
Ghosthunter פורסם 2005 באוגוסט 2 מחבר Share פורסם 2005 באוגוסט 2 תודה רבה!הסתדרתי בסופו של דבר עם FRIEND. קישור לתוכן שתף באתרים אחרים More sharing options...
Recommended Posts
ארכיון
דיון זה הועבר לארכיון ולא ניתן להוסיף בו תגובות חדשות.