我在 OpenGL 2.1 中使用 win32 线程。我想要实现的是渲染简单的图像说“正在加载”,同时在背景中加载整个 3D 场景。它现在工作了,但我有一个问题,有时我的立方体贴图纹理的一部分从 Mozilla Firefox 浏览器中获取数据(这到底是怎么发生的???)并忽略那个带有纹理的小盒子,它只是一个 Sprite 和这是它应该在的地方:
这种情况发生在我尝试加载我的程序的 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;
}
线程管理器:
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 上使用带有最新驱动程序的 Nvidia 670GTX。 有什么问题可能出在哪里吗?
[编辑] 我在加载程序线程的末尾添加了 glFinish(),现在一切正常加载。我在某个地方发红,OpenGL 没有立即完成所有工作,所以我猜是这种情况,上下文在完成工作之前被设置为 NULL。
最佳答案
It works now, but I have a problem, where sometimes a part of my cubemap texture takes data from Mozilla Firefox Browser (How in the hell does this happen???)
您的纹理从未初始化的图形内存中接收数据,其中很可能包含来自另一个进程的残留图像,该进程以前使用过该内存区域。如果
a) 驱动有bug,线程间资源不同步
和
b) 如果您尝试修改纹理,而它已绑定(bind)到另一个线程中的纹理单元。
编辑:您可以(并且应该)自己引入适当的同步。很简单,因为它提高了性能。使用 condition variables在纹理当前不忙时在线程之间进行通信。理想情况下,您使用两个或多个纹理,以循环方式更新。
关于c++ - 在第二个线程上加载 OpenGL 资源,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14872892/
我的瘦服务器配置了nginx,我的ROR应用程序正在它们上运行。在我发布代码更新时运行thinrestart会给我的应用程序带来一些停机时间。我试图弄清楚如何优雅地重启正在运行的Thin实例,但找不到好的解决方案。有没有人能做到这一点? 最佳答案 #Restartjustthethinserverdescribedbythatconfigsudothin-C/etc/thin/mysite.ymlrestartNginx将继续运行并代理请求。如果您将Nginx设置为使用多个上游服务器,例如server{listen80;server
鉴于我有以下迁移:Sequel.migrationdoupdoalter_table:usersdoadd_column:is_admin,:default=>falseend#SequelrunsaDESCRIBEtablestatement,whenthemodelisloaded.#Atthispoint,itdoesnotknowthatusershaveais_adminflag.#Soitfails.@user=User.find(:email=>"admin@fancy-startup.example")@user.is_admin=true@user.save!ende
我收到这个错误:RuntimeError(自动加载常量Apps时检测到循环依赖当我使用多线程时。下面是我的代码。为什么会这样?我尝试多线程的原因是因为我正在编写一个HTML抓取应用程序。对Nokogiri::HTML(open())的调用是一个同步阻塞调用,需要1秒才能返回,我有100,000多个页面要访问,所以我试图运行多个线程来解决这个问题。有更好的方法吗?classToolsController0)app.website=array.join(',')putsapp.websiteelseapp.website="NONE"endapp.saveapps=Apps.order("
当我尝试安装Ruby时遇到此错误。我试过查看this和this但无济于事➜~brewinstallrubyWarning:YouareusingOSX10.12.Wedonotprovidesupportforthispre-releaseversion.Youmayencounterbuildfailuresorotherbreakages.Pleasecreatepull-requestsinsteadoffilingissues.==>Installingdependenciesforruby:readline,libyaml,makedepend==>Installingrub
我一直致力于让我们的Rails2.3.8应用程序在JRuby下正确运行。一切正常,直到我启用config.threadsafe!以实现JRuby提供的并发性。这导致lib/中的模块和类不再自动加载。使用config.threadsafe!启用:$rubyscript/runner-eproduction'pSim::Sim200Provisioner'/Users/amchale/.rvm/gems/jruby-1.5.1@web-services/gems/activesupport-2.3.8/lib/active_support/dependencies.rb:105:in`co
我真的为这个而疯狂。我一直在搜索答案并尝试我找到的所有内容,包括相关问题和stackoverflow上的答案,但仍然无法正常工作。我正在使用嵌套资源,但无法使表单正常工作。我总是遇到错误,例如没有路线匹配[PUT]"/galleries/1/photos"表格在这里:/galleries/1/photos/1/edit路线.rbresources:galleriesdoresources:photosendresources:galleriesresources:photos照片Controller.rbdefnew@gallery=Gallery.find(params[:galle
如何将send与+=一起使用?a=20;a.send"+=",10undefinedmethod`+='for20:Fixnuma=20;a+=10=>30 最佳答案 恐怕你不能。+=不是方法,而是语法糖。参见http://www.ruby-doc.org/docs/ProgrammingRuby/html/tut_expressions.html它说Incommonwithmanyotherlanguages,Rubyhasasyntacticshortcut:a=a+2maybewrittenasa+=2.你能做的最好的事情是:
我们目前正在为ROR3.2开发自定义cms引擎。在这个过程中,我们希望成为我们的rails应用程序中的一等公民的几个类类型起源,这意味着它们应该驻留在应用程序的app文件夹下,它是插件。目前我们有以下类型:数据源数据类型查看我在app文件夹下创建了多个目录来保存这些:应用/数据源应用/数据类型应用/View更多类型将随之而来,我有点担心应用程序文件夹被这么多目录污染。因此,我想将它们移动到一个子目录/模块中,该子目录/模块包含cms定义的所有类型。所有类都应位于MyCms命名空间内,目录布局应如下所示:应用程序/my_cms/data_source应用程序/my_cms/data_ty
我正在尝试使用ruby编写一个双线程客户端,一个线程从套接字读取数据并将其打印出来,另一个线程读取本地数据并将其发送到远程服务器。我发现的问题是Ruby似乎无法捕获线程内的错误,这是一个示例:#!/usr/bin/rubyThread.new{loop{$stdout.puts"hi"abc.putsefsleep1}}loop{sleep1}显然,如果我在线程外键入abc.putsef,代码将永远不会运行,因为Ruby将报告“undefinedvariableabc”。但是,如果它在一个线程内,则没有错误报告。我的问题是,如何让Ruby捕获这样的错误?或者至少,报告线程中的错误?
我是ruby的新手,我认为重新构建一个我用C#编写的简单聊天程序是个好主意。我正在使用Ruby2.0.0MRI(Matz的Ruby实现)。问题是我想在服务器运行时为简单的服务器命令提供I/O。这是从示例中获取的服务器。我添加了使用gets()获取输入的命令方法。我希望此方法在后台作为线程运行,但该线程正在阻塞另一个线程。require'socket'#Getsocketsfromstdlibserver=TCPServer.open(2000)#Sockettolistenonport2000defcommandsx=1whilex==1exitProgram=gets.chomp