本文整理汇总了C++中QMutex类的典型用法代码示例。如果您正苦于以下问题:C++ QMutex类的具体用法?C++ QMutex怎么用?C++ QMutex使用的例子?那么, 这里精选的类代码示例或许可以为您提供帮助。
在下文中一共展示了QMutex类的15个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: run
namespace KSaneIface
{
static FindSaneDevicesThread *s_instancesane = 0;
static QMutex s_mutexsane;
FindSaneDevicesThread *FindSaneDevicesThread::getInstance()
{
s_mutexsane.lock();
if (s_instancesane == 0) {
s_instancesane = new FindSaneDevicesThread();
}
s_mutexsane.unlock();
return s_instancesane;
}
FindSaneDevicesThread::FindSaneDevicesThread() : QThread(0)
{
}
FindSaneDevicesThread::~FindSaneDevicesThread()
{
s_mutexsane.lock();
wait();
s_mutexsane.unlock();
}
void FindSaneDevicesThread::run()
{
SANE_Device const **devList;
//SANE_Int version;
SANE_Status status;
// This is unfortunately not very reliable as many back-ends do not refresh
// the device list after the sane_init() call...
status = sane_get_devices(&devList, SANE_FALSE);
m_deviceList.clear();
if (status == SANE_STATUS_GOOD) {
int i = 0;
KSaneWidget::DeviceInfo tmp;
while(devList[i] != 0) {
tmp.name = devList[i]->name;
tmp.vendor = devList[i]->vendor;
tmp.model = devList[i]->model;
tmp.type = devList[i]->type;
m_deviceList << tmp;
i++;
}
}
}
const QList<KSaneWidget::DeviceInfo> FindSaneDevicesThread::devicesList() const
{
return m_deviceList;
}
}
示例2: playNote
void malletsInstrument::playNote( NotePlayHandle * _n,
sampleFrame * _working_buffer )
{
if( m_filesMissing )
{
return;
}
int p = m_presetsModel.value();
const float freq = _n->frequency();
if ( _n->totalFramesPlayed() == 0 || _n->m_pluginData == NULL )
{
const float vel = _n->getVolume() / 100.0f;
// critical section as STK is not thread-safe
static QMutex m;
m.lock();
if( p < 9 )
{
_n->m_pluginData = new malletsSynth( freq,
vel,
m_vibratoGainModel.value(),
m_hardnessModel.value(),
m_positionModel.value(),
m_stickModel.value(),
m_vibratoFreqModel.value(),
p,
(uint8_t) m_spreadModel.value(),
engine::mixer()->processingSampleRate() );
}
else if( p == 9 )
{
_n->m_pluginData = new malletsSynth( freq,
vel,
p,
m_lfoDepthModel.value(),
m_modulatorModel.value(),
m_crossfadeModel.value(),
m_lfoSpeedModel.value(),
m_adsrModel.value(),
(uint8_t) m_spreadModel.value(),
engine::mixer()->processingSampleRate() );
}
else
{
_n->m_pluginData = new malletsSynth( freq,
vel,
m_pressureModel.value(),
m_motionModel.value(),
m_vibratoModel.value(),
p - 10,
m_strikeModel.value() * 128.0,
m_velocityModel.value(),
(uint8_t) m_spreadModel.value(),
engine::mixer()->processingSampleRate() );
}
m.unlock();
}
const fpp_t frames = _n->framesLeftForCurrentPeriod();
const f_cnt_t offset = _n->noteOffset();
malletsSynth * ps = static_cast<malletsSynth *>( _n->m_pluginData );
ps->setFrequency( freq );
sample_t add_scale = 0.0f;
if( p == 10 )
{
add_scale = static_cast<sample_t>( m_strikeModel.value() ) * freq * 2.5f;
}
for( fpp_t frame = offset; frame < frames + offset; ++frame )
{
_working_buffer[frame][0] = ps->nextSampleLeft() *
( m_scalers[m_presetsModel.value()] + add_scale );
_working_buffer[frame][1] = ps->nextSampleRight() *
( m_scalers[m_presetsModel.value()] + add_scale );
}
instrumentTrack()->processAudioBuffer( _working_buffer, frames + offset, _n );
}
示例3: thread
void tst_QMutex::lock_unlock_locked_tryLock()
{
// normal mutex
QMutex mutex;
mutex_Thread thread(mutex);
QMutex rmutex(QMutex::Recursive);
rmutex_Thread rthread(rmutex);
for (int i = 0; i < iterations; ++i) {
// normal mutex
QVERIFY(mutex.tryLock());
mutex.unlock();
thread.mutex.lock();
thread.start();
for (int j = 0; j < iterations; ++j) {
QVERIFY(thread.cond.wait(&thread.mutex, 10000));
QVERIFY(!mutex.tryLock());
thread.cond.wakeOne();
}
thread.mutex.unlock();
QVERIFY(thread.wait(10000));
QVERIFY(mutex.tryLock());
mutex.unlock();
// recursive mutex
QVERIFY(rmutex.tryLock());
QVERIFY(rmutex.tryLock());
QVERIFY(rmutex.tryLock());
QVERIFY(rmutex.tryLock());
rmutex.unlock();
rmutex.unlock();
rmutex.unlock();
rmutex.unlock();
rthread.mutex.lock();
rthread.start();
for (int k = 0; k < iterations; ++k) {
QVERIFY(rthread.cond.wait(&rthread.mutex, 10000));
QVERIFY(!rmutex.tryLock());
rthread.cond.wakeOne();
}
rthread.mutex.unlock();
QVERIFY(rthread.wait(10000));
QVERIFY(rmutex.tryLock());
QVERIFY(rmutex.tryLock());
QVERIFY(rmutex.tryLock());
QVERIFY(rmutex.tryLock());
rmutex.unlock();
rmutex.unlock();
rmutex.unlock();
rmutex.unlock();
}
}
示例4: DataUnlock
void MutexKnobData::DataUnlock(knobData *kData)
{
QMutex *datamutex;
datamutex = (QMutex*) kData->mutex;
datamutex->unlock();
}
示例5: abort
bool QgsWfsRequest::sendGET( const QUrl &url, bool synchronous, bool forceRefresh, bool cache )
{
abort(); // cancel previous
mIsAborted = false;
mTimedout = false;
mGotNonEmptyResponse = false;
mErrorMessage.clear();
mErrorCode = QgsWfsRequest::NoError;
mForceRefresh = forceRefresh;
mResponse.clear();
QUrl modifiedUrl( url );
// Specific code for testing
if ( modifiedUrl.toString().contains( QLatin1String( "fake_qgis_http_endpoint" ) ) )
{
// Just for testing with local files instead of http:// resources
QString modifiedUrlString = modifiedUrl.toString();
// Qt5 does URL encoding from some reason (of the FILTER parameter for example)
modifiedUrlString = QUrl::fromPercentEncoding( modifiedUrlString.toUtf8() );
QgsDebugMsgLevel( QStringLiteral( "Get %1" ).arg( modifiedUrlString ), 4 );
modifiedUrlString = modifiedUrlString.mid( QStringLiteral( "http://" ).size() );
QString args = modifiedUrlString.mid( modifiedUrlString.indexOf( '?' ) );
if ( modifiedUrlString.size() > 256 )
{
args = QCryptographicHash::hash( args.toUtf8(), QCryptographicHash::Md5 ).toHex();
}
else
{
args.replace( QLatin1String( "?" ), QLatin1String( "_" ) );
args.replace( QLatin1String( "&" ), QLatin1String( "_" ) );
args.replace( QLatin1String( "<" ), QLatin1String( "_" ) );
args.replace( QLatin1String( ">" ), QLatin1String( "_" ) );
args.replace( QLatin1String( "'" ), QLatin1String( "_" ) );
args.replace( QLatin1String( "\"" ), QLatin1String( "_" ) );
args.replace( QLatin1String( " " ), QLatin1String( "_" ) );
args.replace( QLatin1String( ":" ), QLatin1String( "_" ) );
args.replace( QLatin1String( "/" ), QLatin1String( "_" ) );
args.replace( QLatin1String( "\n" ), QLatin1String( "_" ) );
}
#ifdef Q_OS_WIN
// Passing "urls" like "http://c:/path" to QUrl 'eats' the : after c,
// so we must restore it
if ( modifiedUrlString[1] == '/' )
{
modifiedUrlString = modifiedUrlString[0] + ":/" + modifiedUrlString.mid( 2 );
}
#endif
modifiedUrlString = modifiedUrlString.mid( 0, modifiedUrlString.indexOf( '?' ) ) + args;
QgsDebugMsgLevel( QStringLiteral( "Get %1 (after laundering)" ).arg( modifiedUrlString ), 4 );
modifiedUrl = QUrl::fromLocalFile( modifiedUrlString );
}
QgsDebugMsgLevel( QStringLiteral( "Calling: %1" ).arg( modifiedUrl.toDisplayString( ) ), 4 );
QNetworkRequest request( modifiedUrl );
QgsSetRequestInitiatorClass( request, QStringLiteral( "QgsWfsRequest" ) );
if ( !mUri.auth().setAuthorization( request ) )
{
mErrorCode = QgsWfsRequest::NetworkError;
mErrorMessage = errorMessageFailedAuth();
QgsMessageLog::logMessage( mErrorMessage, tr( "WFS" ) );
return false;
}
if ( cache )
{
request.setAttribute( QNetworkRequest::CacheLoadControlAttribute, forceRefresh ? QNetworkRequest::AlwaysNetwork : QNetworkRequest::PreferCache );
request.setAttribute( QNetworkRequest::CacheSaveControlAttribute, true );
}
QWaitCondition waitCondition;
QMutex waitConditionMutex;
bool threadFinished = false;
bool success = false;
std::function<void()> downloaderFunction = [ this, request, synchronous, &waitConditionMutex, &waitCondition, &threadFinished, &success ]()
{
if ( QThread::currentThread() != QgsApplication::instance()->thread() )
QgsNetworkAccessManager::instance( Qt::DirectConnection );
success = true;
mReply = QgsNetworkAccessManager::instance()->get( request );
mReply->setReadBufferSize( READ_BUFFER_SIZE_HINT );
if ( !mUri.auth().setAuthorizationReply( mReply ) )
{
mErrorCode = QgsWfsRequest::NetworkError;
mErrorMessage = errorMessageFailedAuth();
QgsMessageLog::logMessage( mErrorMessage, tr( "WFS" ) );
waitCondition.wakeAll();
success = false;
}
else
{
// We are able to use direct connection here, because we
// * either run on the thread mReply lives in, so DirectConnection is standard and safe anyway
// * or the owner thread of mReply is currently not doing anything because it's blocked in future.waitForFinished() (if it is the main thread)
//.........这里部分代码省略.........
示例6: sleep
/**
* @brief AgentCluster::sleep Pauses the current thread for a designated amount of time.
* @param milliseconds Milliseconds to pause for.
*/
void AgentCluster::sleep(int milliseconds) {
QMutex mut;
mut.lock();
mut.tryLock(milliseconds);
mut.unlock();
}
示例7: concurPrint
void concurPrint(int cID, int bID) {
static QMutex l;
l.lock();
cout << "Customer " << cID << " is being serviced by barber " << bID << endl;
l.unlock();
}
示例8: tryLock
void tst_QMutex::tryLock()
{
// test non-recursive mutex
{
class Thread : public QThread
{
public:
void run()
{
testsTurn.release();
// TEST 1: thread can't acquire lock
threadsTurn.acquire();
QVERIFY(!normalMutex.tryLock());
testsTurn.release();
// TEST 2: thread can acquire lock
threadsTurn.acquire();
QVERIFY(normalMutex.tryLock());
QVERIFY(lockCount.testAndSetRelaxed(0, 1));
QVERIFY(!normalMutex.tryLock());
QVERIFY(lockCount.testAndSetRelaxed(1, 0));
normalMutex.unlock();
testsTurn.release();
// TEST 3: thread can't acquire lock, timeout = waitTime
threadsTurn.acquire();
QTime timer;
timer.start();
QVERIFY(!normalMutex.tryLock(waitTime));
QVERIFY(timer.elapsed() >= waitTime);
testsTurn.release();
// TEST 4: thread can acquire lock, timeout = waitTime
threadsTurn.acquire();
timer.start();
QVERIFY(normalMutex.tryLock(waitTime));
QVERIFY(timer.elapsed() <= waitTime);
QVERIFY(lockCount.testAndSetRelaxed(0, 1));
timer.start();
// it's non-recursive, so the following lock needs to fail
QVERIFY(!normalMutex.tryLock(waitTime));
QVERIFY(timer.elapsed() >= waitTime);
QVERIFY(lockCount.testAndSetRelaxed(1, 0));
normalMutex.unlock();
testsTurn.release();
// TEST 5: thread can't acquire lock, timeout = 0
threadsTurn.acquire();
QVERIFY(!normalMutex.tryLock(0));
testsTurn.release();
// TEST 6: thread can acquire lock, timeout = 0
threadsTurn.acquire();
timer.start();
QVERIFY(normalMutex.tryLock(0));
QVERIFY(timer.elapsed() < waitTime);
QVERIFY(lockCount.testAndSetRelaxed(0, 1));
QVERIFY(!normalMutex.tryLock(0));
QVERIFY(lockCount.testAndSetRelaxed(1, 0));
normalMutex.unlock();
testsTurn.release();
// TEST 7 overflow: thread can acquire lock, timeout = 3000 (QTBUG-24795)
threadsTurn.acquire();
timer.start();
QVERIFY(normalMutex.tryLock(3000));
QVERIFY(timer.elapsed() < 3000);
normalMutex.unlock();
testsTurn.release();
threadsTurn.acquire();
}
};
Thread thread;
thread.start();
// TEST 1: thread can't acquire lock
testsTurn.acquire();
normalMutex.lock();
QVERIFY(lockCount.testAndSetRelaxed(0, 1));
threadsTurn.release();
// TEST 2: thread can acquire lock
testsTurn.acquire();
QVERIFY(lockCount.testAndSetRelaxed(1, 0));
normalMutex.unlock();
threadsTurn.release();
// TEST 3: thread can't acquire lock, timeout = waitTime
testsTurn.acquire();
normalMutex.lock();
QVERIFY(lockCount.testAndSetRelaxed(0, 1));
threadsTurn.release();
// TEST 4: thread can acquire lock, timeout = waitTime
testsTurn.acquire();
QVERIFY(lockCount.testAndSetRelaxed(1, 0));
normalMutex.unlock();
//.........这里部分代码省略.........
示例9: equals
namespace Type {
bool equals( const QVariant & a, const QVariant & b )
{
return ( a == b ) || Data::equals( a.userType(), a.constData(),
b.userType(), b.constData() );
}
bool lessThan( const QVariant & a, const QVariant & b )
{
return Data::lessThan( a.userType(), a.constData(),
b.userType(), b.constData() );
}
bool convert( const QVariant & from, QVariant & to )
{
const QVariant::Type toType = (QVariant::Type) to.userType();
if( from.canConvert( toType ) )
{
to.setValue( from );
return to.convert( toType );
}
return Data::convert(
from.userType(), from.constData(),
toType, const_cast<void*>(to.constData()) );
}
bool canConvert( const QVariant & from, int toType )
{
return from.canConvert( (QVariant::Type) toType ) ||
Data::canConvert( from.userType(), toType );
}
static QMutex lh_type_data_mutex_;
static const Data * lh_first_info_ = 0;
static int lh_lock_and_filter( int typeId )
{
lh_type_data_mutex_.lock();
if( typeId < QMetaType::User )
{
Q_ASSERT( !"LH::Type::Data: type ID < QMetaType::User" );
return 0;
}
const Data * mt = lh_first_info_;
while( mt )
{
if( typeId == mt->typeId())
{
Q_ASSERT( !"LH::Type::Data: type ID already registered" );
return 0;
}
mt = mt->next();
}
return typeId;
}
bool Data::equals( int typeId1, const void * p1, int typeId2, const void * p2 )
{
const Data * mt = lh_first_info_;
while( mt )
{
if( typeId1 == mt->typeId_ && mt->equals( p1, typeId2, p2 ) ) return true;
if( typeId2 == mt->typeId_ && mt->equals( p2, typeId1, p1 ) ) return true;
mt = mt->next_;
}
return false;
}
bool Data::lessThan( int typeId1, const void * p1, int typeId2, const void * p2 )
{
const Data * mt = lh_first_info_;
while( mt )
{
if( typeId1 == mt->typeId_ && mt->lessThan( p1, typeId2, p2 ) ) return true;
if( typeId2 == mt->typeId_ && mt->lessThan( p2, typeId1, p1 ) ) return false;
mt = mt->next_;
}
return false;
}
bool Data::convert( int fromTypeId, const void * p, int toTypeId, void * v )
{
const Data * mt = lh_first_info_;
bool found = false;
while( mt )
{
if( fromTypeId == mt->typeId() )
{
found = true;
if( mt->canConvertTo( toTypeId ) )
{
return mt->convertTo( p, toTypeId, v );
}
if( mt->canCastTo( toTypeId ) )
{
return mt->castTo( p, toTypeId, v );
}
}
if( toTypeId == mt->typeId() && mt->canConvertFrom( fromTypeId ) )
//.........这里部分代码省略.........
示例10: decode
void QVideoDecoder::decode()
{
if(m_video->m_status == QVideo::NotRunning)
return;
emit ready(false);
AVPacket pkt1, *packet = &pkt1;
double pts;
int frame_finished = 0;
while(!frame_finished && !m_killed)
{
if(av_read_frame(m_av_format_context, packet) >= 0)
{
// Is this a packet from the video stream?
if(packet->stream_index == m_video_stream)
{
global_video_pkt_pts = packet->pts;
// mutex.lock();
avcodec_decode_video(m_video_codec_context, m_av_frame, &frame_finished, packet->data, packet->size);
// mutex.unlock();
if(packet->dts == AV_NOPTS_VALUE &&
m_av_frame->opaque &&
*(uint64_t*)m_av_frame->opaque != AV_NOPTS_VALUE)
{
pts = *(uint64_t *)m_av_frame->opaque;
}
else if(packet->dts != AV_NOPTS_VALUE)
{
pts = packet->dts;
}
else
{
pts = 0;
}
pts *= av_q2d(m_timebase);
// Did we get a video frame?
if(frame_finished)
{
// size_t num_native_bytes = m_av_frame->linesize[0] * m_video_codec_context->height;
// size_t num_rgb_bytes = m_av_rgb_frame->linesize[0] * m_video_codec_context->height;
// Convert the image from its native format to RGB, then copy the image data to a QImage
if(m_sws_context == NULL)
{
mutex.lock();
m_sws_context = sws_getContext(
m_video_codec_context->width, m_video_codec_context->height,
m_video_codec_context->pix_fmt,
m_video_codec_context->width, m_video_codec_context->height,
//PIX_FMT_RGB32,SWS_BICUBIC,
RAW_PIX_FMT, SWS_FAST_BILINEAR,
NULL, NULL, NULL); //SWS_PRINT_INFO
mutex.unlock();
//printf("decode(): created m_sws_context\n");
}
//printf("decode(): got frame\n");
// mutex.lock();
sws_scale(m_sws_context,
m_av_frame->data,
m_av_frame->linesize, 0,
m_video_codec_context->height,
m_av_rgb_frame->data,
m_av_rgb_frame->linesize);
// mutex.unlock();
// size_t num_bytes = m_av_rgb_frame->linesize[0] * m_video_codec_context->height;
// if(m_frame)
// delete m_frame;
m_frame = QImage(m_av_rgb_frame->data[0],
m_video_codec_context->width,
m_video_codec_context->height,
QImage::Format_RGB16);
av_free_packet(packet);
// This block from the synchronize_video(VideoState *is, AVFrame *src_frame, double pts) : double
// function given at: http://www.dranger.com/ffmpeg/tutorial05.html
{
// update the frame pts
double frame_delay;
if(pts != 0)
{
/* if we have pts, set video clock to it */
m_video_clock = pts;
} else {
/* if we aren't given a pts, set it to the clock */
pts = m_video_clock;
}
/* update the video clock */
frame_delay = av_q2d(m_timebase);
//.........这里部分代码省略.........
示例11: run
void MythSystemLegacyManager::run(void)
{
RunProlog();
LOG(VB_GENERAL, LOG_INFO, "Starting process manager");
// run_system is set to false during shutdown, and we need this thread to
// exit during shutdown.
while( run_system )
{
// check for any running processes
m_mapLock.lock();
if( m_childCount == 0 )
{
m_mapLock.unlock();
usleep( 100000 );
continue;
}
DWORD result = WaitForMultipleObjects( m_childCount, m_children,
FALSE, 100 );
if ( result == WAIT_TIMEOUT || result == WAIT_FAILED )
{
m_mapLock.unlock();
continue;
}
int index = result - WAIT_OBJECT_0;
if ( index < 0 || index > m_childCount - 1 )
{
m_mapLock.unlock();
continue;
}
HANDLE child = m_children[index];
// pop exited process off managed list, add to cleanup list
MythSystemLegacyWindows *ms = m_pMap.take(child);
ChildListRebuild();
m_mapLock.unlock();
// Occasionally, the caller has deleted the structure from under
// our feet. If so, just log and move on.
if (!ms || !ms->m_parent)
{
LOG(VB_SYSTEM, LOG_ERR,
QString("Structure for child handle %1 already deleted!")
.arg((long long)child));
if (ms)
{
listLock.lock();
msList.append(ms);
listLock.unlock();
}
continue;
}
listLock.lock();
msList.append(ms);
DWORD status;
GetExitCodeProcess( child, &status );
ms->SetStatus(status);
LOG(VB_SYSTEM, LOG_INFO,
QString("Managed child (Handle: %1) has exited! "
"command=%2, status=%3, result=%4")
.arg((long long)child) .arg(ms->GetLogCmd()) .arg(status)
.arg(ms->GetStatus()));
// loop through running processes for any that require action
MSMap_t::iterator i;
time_t now = time(nullptr);
m_mapLock.lock();
m_jumpLock.lock();
for (i = m_pMap.begin(); i != m_pMap.end(); ++i)
{
child = i.key();
ms = i.value();
// handle processes beyond marked timeout
if( ms->m_timeout > 0 && ms->m_timeout < now )
{
// issuing KILL signal after TERM failed in a timely manner
if( ms->GetStatus() == GENERIC_EXIT_TIMEOUT )
{
LOG(VB_SYSTEM, LOG_INFO,
QString("Managed child (Handle: %1) timed out, "
"issuing KILL signal").arg((long long)child));
// Prevent constant attempts to kill an obstinate child
ms->m_timeout = 0;
ms->Signal(SIGKILL);
}
// issuing TERM signal
else
{
LOG(VB_SYSTEM, LOG_INFO,
//.........这里部分代码省略.........
示例12: getBacktrace
//from http://jpassing.com/2008/03/12/walking-the-stack-of-the-current-thread/
// http://www.codeproject.com/Articles/11132/Walking-the-callstack
//alternative: __builtin_return_address, but it is said to not work so well
QString getBacktrace(){
if (!backtraceMutex.tryLock()) return "locked";
//init crap
HANDLE process = GetCurrentProcess();
HANDLE thread = GetCurrentThread();
QStringList result(initDebugHelp());
CONTEXT context;
ZeroMemory( &context, sizeof( CONTEXT ) );
STACKFRAME64 stackFrame;
#if (defined(x86_64) || defined(__x86_64__))
RtlCaptureContext( &context );
#else
// Those three registers are enough.
geteip:
context.Eip = (DWORD)&&geteip;
__asm__(
"mov %%ebp, %0\n"
"mov %%esp, %1"
: "=r"(context.Ebp), "=r"(context.Esp));
#endif
ZeroMemory( &stackFrame, sizeof( stackFrame ) );
#ifdef CPU_IS_64
DWORD machineType = IMAGE_FILE_MACHINE_AMD64;
stackFrame.AddrPC.Offset = context.Rip;
stackFrame.AddrPC.Mode = AddrModeFlat;
stackFrame.AddrFrame.Offset = context.Rbp;//changed from rsp. correctly?
stackFrame.AddrFrame.Mode = AddrModeFlat;
stackFrame.AddrStack.Offset = context.Rsp;
stackFrame.AddrStack.Mode = AddrModeFlat;
#else
DWORD machineType = IMAGE_FILE_MACHINE_I386;
stackFrame.AddrPC.Offset = context.Eip;
stackFrame.AddrPC.Mode = AddrModeFlat;
stackFrame.AddrFrame.Offset = context.Ebp;
stackFrame.AddrFrame.Mode = AddrModeFlat;
stackFrame.AddrStack.Offset = context.Esp;
stackFrame.AddrStack.Mode = AddrModeFlat;
/* #elif _M_IA64
MachineType = IMAGE_FILE_MACHINE_IA64;
StackFrame.AddrPC.Offset = Context.StIIP;
StackFrame.AddrPC.Mode = AddrModeFlat;
StackFrame.AddrFrame.Offset = Context.IntSp;
StackFrame.AddrFrame.Mode = AddrModeFlat;
StackFrame.AddrBStore.Offset= Context.RsBSP;
StackFrame.AddrBStore.Mode = AddrModeFlat;
StackFrame.AddrStack.Offset = Context.IntSp;
StackFrame.AddrStack.Mode = AddrModeFlat;
#else
#error "Unsupported platform"*/
#endif
static HMODULE dbghelp = LoadLibraryA("dbghelp.dll");
if (!dbghelp) return "failed to load dbghelp.dll";
LOAD_FUNCTIONREQ(StackWalk64, "StackWalk64");
LOAD_FUNCTIONREQ(SymGetModuleBase64, "SymGetModuleBase64");
LOAD_FUNCTIONREQ(SymFunctionTableAccess64, "SymFunctionTableAccess64");
//get stackframes
QList<DWORD64> stackFrames;
while ((*StackWalk64)(machineType, process, thread, &stackFrame, &context, 0, SymFunctionTableAccess64, SymGetModuleBase64, 0))
stackFrames << stackFrame.AddrPC.Offset;
result << lookUpAddresses(stackFrames);
backtraceMutex.unlock();
return result.join("\r\n");
}
示例13:
~autolock ()
{
mutex.unlock();
}
示例14: paintGL
virtual void paintGL()
{
mutex.lock();
frame();
mutex.unlock();
}
示例15: BeginPaint
virtual void BeginPaint()
{
paintLock.lock();
Clear();
}