- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
一天多来我一直在努力寻找这个错误,我开始发疯了......我已经重写并仔细检查了拖放代码,但无济于事。
它发生在主 Qt 事件循环 a.exec() 中,来自 valgrind 的堆栈跟踪如下所示。它有时会在 QMutex::Lock() 上崩溃(我只使用一个 QThread(主 qt 事件循环),所有其他线程都包含在后端并且是安全的)
由于我自己使用鼠标花了一个多小时才发现该错误,因此我编写了一个函数来移动鼠标,包括按下、释放、单击、双击。这会导致错误在大约十分钟内发生。
我会发布一些代码,但是它们有几千行用于拖放的东西(除了这个烦人的错误之外它工作得很好)
拖动可能发生在两种类型的项目中,并且两者基本相同。在鼠标移动事件中, drag->exec() 被调用。
我正在使用子类 mime 数据以允许它包含我需要的内容。
任何帮助都会很棒...
Invalid read of size 8
in main in Src/Program/main.cpp:77
Address 0x40 is not stack'd, malloc'd or (recently) free'd
1: QCoreApplication::postEvent(QObject*, QEvent*, int) in /usr/lib/x86_64-linux-gnu/libQtCore.so.4.8.1
2: /usr/lib/x86_64-linux-gnu/libQtGui.so.4.8.1
3: QApplication::x11ClientMessage(QWidget*, _XEvent*, bool) in /usr/lib/x86_64-linux-gnu/libQtGui.so.4.8.1
4: QApplication::x11ProcessEvent(_XEvent*) in /usr/lib/x86_64-linux-gnu/libQtGui.so.4.8.1
5: /usr/lib/x86_64-linux-gnu/libQtGui.so.4.8.1
6: g_main_context_dispatch in /lib/x86_64-linux-gnu/libglib-2.0.so.0.3200.3
7: /lib/x86_64-linux-gnu/libglib-2.0.so.0.3200.3
8: g_main_context_iteration in /lib/x86_64-linux-gnu/libglib-2.0.so.0.3200.3
9: QEventDispatcherGlib::processEvents(QFlags<QEventLoop::ProcessEventsFlag>) in /usr/lib/x86_64-linux-gnu/libQtCore.so.4.8.1
10: /usr/lib/x86_64-linux-gnu/libQtGui.so.4.8.1
11: QEventLoop::processEvents(QFlags<QEventLoop::ProcessEventsFlag>) in /usr/lib/x86_64-linux-gnu/libQtCore.so.4.8.1
12: QEventLoop::exec(QFlags<QEventLoop::ProcessEventsFlag>) in /usr/lib/x86_64-linux-gnu/libQtCore.so.4.8.1
13: QCoreApplication::exec() in /usr/lib/x86_64-linux-gnu/libQtCore.so.4.8.1
14: main in
主要内容:
QApplication a(argc, argv);
if (testing)
{
UnitTest::RunAllTests();
return 0;
}
MainWindow w(debug, testing);
w.show();
w.InitialiseGUI();
return a.exec(); <- line 77
创建拖动对象时:
void ElementItem::mouseMoveEvent(QMouseEvent * event)
{
if
(
(event->buttons() & Qt::LeftButton) &&
((event->pos() - _drag_start_position).manhattanLength() > DRAG_START_DISTANCE)
)
{
_control_and_status->_drag_control_object->NotifyDragStarted();
try
{
// Ensure that if something goes wrong and old widget does not get deleted.
// create a new drag object
_drag = new QDrag(this);
// create a custom mime type (subclass of QMimeType)
WidgetMimeType *mimeData = new WidgetMimeType;
ChainWidgetBase * base_widget = LoadElementAndWidget();
// Set the widget as this object
if (base_widget)
{
mimeData->_widget = (QWidget *) base_widget;
mimeData->_delete_on_failure = true;
mimeData->_widget_deletion_required = &_widget_deletion_required;
}
else
{
delete _drag;
_drag = NULL;
throw GeneralException(ErrorReporting::ERROR_IN_DROPPABLE_CONTAINER, "Null widget");
}
_drag->setMimeData(mimeData);
Qt::DropAction dropAction = _drag->exec();
}
catch(...)
{
}
DragStopped();
}
}
这是创建拖动对象的地方之一,还有 3 个做不同的事情,但使用相同的方法
子类 mime 数据:
#pragma once
#include <QtGui>
class WidgetMimeType : public QMimeData
{
public:
WidgetMimeType():
_widget(NULL),
_delete_on_failure(false),
_deletion_required_dummy(false),
_widget_deletion_required(&_deletion_required_dummy)
{
}
~WidgetMimeType()
{
}
QWidget * _widget;
bool _delete_on_failure;
bool _deletion_required_dummy;
bool * _widget_deletion_required;
};
编辑:我已经添加了 QT 源,崩溃的位置:
void QCoreApplication::postEvent(QObject *receiver, QEvent *event, int priority)
{
if (receiver == 0) {
qWarning("QCoreApplication::postEvent: Unexpected null receiver");
delete event;
return;
}
QThreadData * volatile * pdata = &receiver->d_func()->threadData;
QThreadData *data = *pdata; <--- CRASHES HERE
if (!data) {
// posting during destruction? just delete the event to prevent a leak
delete event;
return;
}
// lock the post event mutex
data->postEventList.mutex.lock();
// if object has moved to another thread, follow it
while (data != *pdata) {
data->postEventList.mutex.unlock();
data = *pdata;
if (!data) {
// posting during destruction? just delete the event to prevent a leak
delete event;
return;
}
data->postEventList.mutex.lock();
}
崩溃发生在上面显示的行中,上面写着<---- CRASH HERE。它来自取消引用指针。这些信息是否足以确定发生了什么?
最佳答案
Qt::DropAction dropAction = _drag->exec();
这是您的代码可能会崩溃的行。我没有完全阅读您的代码,但我假设在拖动小部件后您正在使用 deleteLater() 函数删除原始小部件。如果是这种情况,那么对于窗口平台 tit 将正常工作,因为 _drag->exec()
将阻止事件,如果是 mac 或 Linux,它将不会阻止事件。这样, _drag->exec()
的事件在执行事件时得到空指针。
我知道这个 deleteLater()
在控制返回到事件循环时对象将被删除时执行。
一般来说,deleteLater()是在_drag->exec()完成之前执行的。
关于c++ - 由于在 Qt 中拖放导致未知的间歇性崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14856836/
我在Web应用程序中使用WebRTC进行音频播放。因为我是WebRTC的新手,所以我使用@https://webrtc.github.io/samples/src/content/peerconnec
上下文 我的 VBA 代码经常替换工作簿中的工作表。因此,我无法直接在工作表模块中使用代码,因为它最终会在此过程中被删除。 我使用用户定义的类来处理我的事件(强烈受到 Chip Pearson's w
我已经搜索过这个问题,如果这个问题已经得到解答,我深表歉意(我很高兴被重定向),但具体来说,我们的问题是间歇性的。 我们的客户提示当事件从我们的软件发送到他们的手机时,通知音频间歇性地没有“响起”。它
背景故事优先: 我们有一个正在运行的部署在尝试使用 JMeter 等工具对其进行负载测试时遇到间歇性 502。它是一个将 POST 数据记录到另一个容器上的 mysql 数据库的容器。它每秒处理大约
在向我托管的 https://网站发出简单的 GET 请求时,我不断收到间歇性 SecureChannelFailure 错误。没有错误进入服务器日志文件。每 100 次调用的频率小于 1 个错误,但
我正在通过 eval 运行一些 JavaScript(我知道,开枪吧),它基本上枚举了文档对象上的所有属性。我的问题是,虽然它在 firebug 中工作,但从脚本运行时,它在 Firefox 中抛出未
我发现了这个关于 iBeacon 的教程 (http://www.appcoda.com/ios7-programming-ibeacons-tutorial/),我觉得很有趣。我已经下载了他们的源代
我在我的开发箱上本地运行 WCF 服务,我的测试检查该服务一切正常。 通常,一切都很好,但有时(5% 的时间),我会收到错误 The requested service, 'net.tcp://csm
我正在使用 django 和 jQuery 构建一个网络应用程序,并且在其中一个页面上 $(document).com('click'... 事件间歇性地触发。我在结帐队列中有一个项目列表,以及删除每
Excepcion:com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure ...
我正在尝试对 MySQL 5.5 数据库执行一系列检查/插入操作,但我经常遇到间歇性的 SIGSEGV 错误问题。在执行许多查询的过程中,SELECT 语句运行得很好。然而,在经过一些可变的时间或执行
我每天至少发生一次崩溃,我似乎真的无法理解。它似乎在随机时刻发生在我身上,我无法追踪堆栈来理解它发生的原因。如果有人能为我指出正确的方向,甚至向我展示一些关于如何正确追踪值的在线文档和教程,那将是完美
我尝试用一些更简单的函数重现它,但没有成功。所以下面的代码显示了我们的生产服务器抛出的 KeyError 的相关方法,很多。 class PokerGame: ... def serial
我们有一个托管在 Windows 服务中的 WCF 服务和一个访问该服务的非线程客户端。该服务正在执行对 SQL Server 2008 数据库的数据访问。间歇性地在客户端发生以下异常: System
我们有一个 SSL 问题,我 99% 认为这不是您通常使用的证书信任存储旋转木马。 我们有一个 Weblogic 服务器试图通过 LDAPS 与 Active Directory 建立 SSL 连接,
我有一个复杂的经典 ASP 系统,多年来运行良好,但最近开始出现奇怪的间歇性问题。 在某些表单上,人们会报告说他们点击了“提交”,但表单只是自行重置(或者,浏览器可能只是重新加载了表单——我的用户可能
我在编译顶点着色器时遇到间歇性错误,为新创建的 OpenGL 上下文的首次渲染做准备。它是通常在相同硬件上运行的相同顶点着色器。失败后,glGetShaderInfoLog 返回的信息日志通常显示如下
我有一个目前看来无法解决的 EXC_BAD_ACCESS 问题。我试过启用 NSZombie,这似乎是许多帖子中的建议,但我处理的是 c 指针而不是 obj c 对象,所以我没有获得任何有用的调试信息
在 iOS 上出现间歇性 SSL 错误。我已经关闭了 ATS,我们知道这也会发生在操作系统版本 < iOS9 上 Error Domain=NSURLErrorDomain Code=1011 "An
我有一个使用 RequireJS 的相当大的 Backbone.js 项目。随着项目规模的增长(这里的“规模”指的是独立模块文件的数量),间歇性错误开始出现。大多数情况下,这是一个对象错误: 未捕获的
我是一名优秀的程序员,十分优秀!