पर मैं ओपनजीएल 2.1 के साथ Win32 थ्रेड का उपयोग करता हूं। जो मैं हासिल करने की कोशिश कर रहा हूं वह है कि "लोडिंग" कहकर सरल छवि प्रस्तुत करना है, जबकि पृष्ठभूमि में पूरे 3 डी दृश्य को लोड किया जा रहा है। यह अब काम करता है, लेकिन मुझे एक समस्या है, जहां कभी-कभी मेरे क्यूबमैप बनावट का एक हिस्सा मोज़िला फ़ायरफ़ॉक्स ब्राउज़र से डेटा लेता है (यह कैसे होता है ???) और बनावट के साथ उस छोटे बॉक्स को अनदेखा करें, यह केवल एक स्प्राइट है और यह वह जगह है जहां यह होना चाहिए .: ओपनजीएल संसाधन लोडिंग दूसरे थ्रेड
यह 3 बार में होता है जैसे मैं अपना प्रोग्राम लोड करने का प्रयास करता हूं। यह कैसे मेरे धागा लग रहा है:
WindowsThread::WindowsThread(HGLRC graphicsContext, HDC deviceContext) :
graphicsContext_(graphicsContext),
deviceContext_(deviceContext),
running_(false),
task_(0),
mode_(WT_NORMAL)
{
handle_ = CreateThread(0, 0,
(unsigned long (__stdcall *)(void *)) this->staticRun,
(void*) this, CREATE_SUSPENDED, &id_);
if (handle_ == 0) {
LOGE("Unable to create thread.");
return;
}
if (!SetThreadPriority(handle_, THREAD_PRIORITY_NORMAL)) {
LOGE("Unable to set thread priority for thread.");
return;
}
}
WindowsThread::~WindowsThread() {
finishTask();
running_ = false;
WaitForSingleObject(handle_, INFINITE);
CloseHandle(handle_);
wglDeleteContext(graphicsContext_);
}
void WindowsThread::start() {
running_ = true;
if (!ResumeThread(handle_)) {
LOGW("Unable to resume thread.");
}
}
bool WindowsThread::isRunning() {
return running_;
}
void WindowsThread::setTask(Task* task, Mode mode) {
finishTask();
task_ = task;
mode_ = mode;
}
bool WindowsThread::hasTask() {
return task_ != 0;
}
void WindowsThread::finishTask() {
while (task_ != 0) {
Sleep(1);
}
}
void WindowsThread::stop() {
running_ = false;
}
int WindowsThread::staticRun(void* thread) {
return ((WindowsThread*) thread)->run();
}
int WindowsThread::run() {
wglMakeCurrent(deviceContext_, graphicsContext_);
while (running_) {
if (task_ != 0) {
task_->run();
task_ = 0;
}
Sleep(10);
}
wglMakeCurrent(0, 0);
return 1;
}
ThreadManager:
WindowsThreadManager::WindowsThreadManager(
System* system, UINT threadPoolSize)
{
if (threadPoolSize == 0) {
SYSTEM_INFO info;
GetSystemInfo(&info);
threadPoolSize = info.dwNumberOfProcessors;
if (threadPoolSize == 0) {
threadPoolSize = 1;
}
}
LOGI("Number of threads used: %d", threadPoolSize);
masterContext_ = wglGetCurrentContext();
HDC hdc = wglGetCurrentDC();
for (UINT i = 0; i < threadPoolSize; i++) {
HGLRC threadContext = wglCreateContext(hdc);
wglShareLists(masterContext_, threadContext);
WindowsThread* thread = new WindowsThread(threadContext, hdc);
thread->start();
threads_.push_back(thread);
}
}
WindowsThreadManager::~WindowsThreadManager() {
for (UINT i = 0; i < threads_.size(); i++) {
delete threads_[i];
}
for (UINT i = 0; i < tasks_.size(); i++) {
delete tasks_[i];
}
}
void WindowsThreadManager::execute(Task* task, Mode mode) {
WindowsThread::Mode wtMode = WindowsThread::WT_NORMAL;
if (mode == TM_GRAPHICS_CONTEXT) {
wtMode = WindowsThread::WT_GRPAHICS_CONTEXT;
}
tasks_.push_back(task);
for (UINT i = 0; i < threads_.size(); i++) {
if (!threads_[i]->hasTask()) {
threads_[i]->setTask(task, wtMode);
return;
}
}
threads_[0]->setTask(task, wtMode);
}
void WindowsThreadManager::joinAll() {
for (UINT i = 0; i < threads_.size(); i++) {
if (threads_[i]->hasTask()) {
threads_[i]->finishTask();
}
}
}
मैं Winodws 8. किसी भी विचार के बारे में नवीनतम चालकों के साथ एनवीडिया 670GTX का उपयोग जहां समस्या हो सकती है?
[संपादित करें] मैंने अपने लोडर थ्रेड के अंत में glfinish() जोड़ा, और अब सबकुछ सामान्यता लोड करता है। मैं कहीं कहीं लाल हूं, कि ओपनजीएल तुरंत इसके सभी काम खत्म नहीं करता है, इसलिए मुझे लगता है कि यह मामला था, जहां संदर्भ को पूरा करने से पहले संदर्भ को पूर्ण करने के लिए सेट किया गया था।
एक नोट लें कि ओपनग्ल और थ्रेड आमतौर पर –
के साथ नहीं जाते हैं, हाँ, मैं इसके बारे में काफी कुछ करता हूं। वास्तव में, मैंने पहले दो संदर्भों को लागू किया था, एक पर मैंने प्रस्तुत किया था, दूसरे पर मैंने संसाधनों को लोड किया था, और जब संसाधन लोड किए गए थे, तो मैंने अंतिम संदर्भ को हटाते हुए उस संदर्भ को लिया और इसे मुख्य संदर्भ बना दिया। यह कोई समस्या नहीं के साथ काम किया। – SMart
@ BЈовић: ओपनजीएल और मल्टीथ्रेडिंग किया जा सकता है, यह सही पाने के लिए बस इतना आसान नहीं है। – datenwolf