2015-02-18 4 views
7

मैं अपने ओपनजीएल प्रोजेक्ट के लिए लोडिंग स्क्रीन बनाने की कोशिश कर रहा हूं और इसे पढ़ा है कि इसे सही तरीके से काम करने के लिए यह थ्रेडिंग का उपयोग करना सबसे अच्छा था। मैं अपने धागा के साथ अपने कार्य को करने के कोशिश कर रहा हूँ, लेकिन मैं इन त्रुटियों को प्राप्त हो रही है:मैं कक्षा में थ्रेडिंग का उपयोग कैसे करूं?

त्रुटि C2064: अवधि एक समारोह 3 तर्क

लेने

IntelliSense का मूल्यांकन नहीं करता है: निर्माता का कोई उदाहरण "एसटीडी :: धागा :: सूत्र "से मेल खाता है तर्क सूची तर्क प्रकार हैं: (शून्य (स्क्रीन * newScreen, bool activeVisuals, bool activeControls), PlayScreen *, bool, bool)

यह मेरा कोड है:

//LoadingScreen 
class LoadingScreen 
{ 
    LoadingScreen(); 
    void LoadNewScreen(Screen* newScreen, bool activeVisuals, bool activeControls); 
    void Setup(); 
}; 

void LoadingScreen::LoadNewScreen(Screen* newScreen, bool activeVisuals, bool activeControls) 
{ 

} 

void LoadingScreen::Setup() 
{ 
    PlayScreen *playScreen = new PlayScreen(); 
    std::thread first(LoadingScreen::LoadNewScreen,playScreen, true, true);// , playScreen, true, true); 

    first.join(); 
} 

//source.cpp 
LoadingScreen loadingScreen; 
int main() 
{ 
    LoadingScreen loadingScreen = LoadingScreen(); 
    loadingScreen.Setup(); 

    return 0; 
} 
+1

सुनिश्चित करें कि आप यह समझते समय ओपनजीएल के साथ थ्रेडिंग कैसे खेलते हैं यह सुनिश्चित करें। मुझे नहीं पता कि आप किस तरह के संसाधन लोड कर रहे हैं, लेकिन आप CPU/GPU सिंक्रनाइज़ेशन समस्याओं में भाग ले सकते हैं यदि आप एकाधिक रेंडर संदर्भों का उपयोग करते हैं जो संसाधन या मानचित्र/अनमैप बफर मेमोरी साझा करते हैं। –

+0

@ एंडोनएम। कोलमैन हाँ मुझे थ्रेडिंग के साथ काम करने में परेशानी हो रही है। यह अपवाद फेंकता रहता है कि मुझे इस तरह की कोई जानकारी नहीं मिल रही है: 0x00E9E2C9 पर अनचाहे अपवाद [प्रोग्राम नाम] 0xC0000005: उल्लंघन उल्लंघन स्थान 0x00000020 तक पहुंचें। – WhyYouNoWork

उत्तर

5

आपको एक अतिरिक्त पैरामीटर पारित करने की आवश्यकता है जो कक्षा का एक उदाहरण है जिसका सदस्य कार्य पहले तर्क के रूप में पारित किया गया था।

std::thread first(&LoadingScreen::LoadNewScreen, this, playScreen, true, true); 
              // ^^^^ <= instance of LoadingScreen 

अतिरिक्त पैरामीटर की जरूरत है क्योंकि यह है कि क्या वास्तव में LoadNewScreen कॉल है।

this->LoadNewScreen(playScreen, true, true); 
+0

यह एक उदाहरण के लिए _pointer_ है। –

+0

@LightnessRacesinOrbit ठीक है आपको एक सूचक को पास करने की आवश्यकता नहीं है लेकिन इस मामले में, हाँ। – Axalo

+0

इसे संकलित करने के लिए मिला। जवाब के लिए धन्यवाद। अतिरिक्त उदाहरण की आवश्यकता क्यों है? – WhyYouNoWork

1

आपको std::thread(Function &&f, Args&&... args) एक लैम्ब्डा या फ़ंक्शन पॉइंटर देने की आवश्यकता है।

बदलें

std::thread first(LoadingScreen::LoadNewScreen,playScreen, true, true); 

std::thread first(&LoadingScreen::LoadNewScreen,playScreen, true, true); 

या एक लैम्ब्डा करने के लिए आप this सूचक के लिए एक संदर्भ की आवश्यकता है।

+0

गायब ऑब्जेक्ट पॉइंटर को न भूलें। –

+0

मैंने जवाब देने से पहले यह कोशिश की। यह मेरी पहली त्रुटि का कारण बनता है जिसे मैंने – WhyYouNoWork

+1

सूचीबद्ध किया है क्योंकि ऐसा है क्योंकि आप अनुपलब्ध ऑब्जेक्ट पॉइंटर भूल गए हैं। –

संबंधित मुद्दे