标签: c++builder

在第二台显示器上启动程序?

有没有办法在Delphi或C++ Builder中指定应用程序出现在哪个监视器上?

我正在为一个客户开发一个简单的程序,它在一个二级监视器上显示厨房订单,由一个酒店系统生成.目前,他们需要在启动后手动将窗口拖动到第二个监视器上.

delphi multiple-monitors c++builder point-of-sale

20
推荐指数
2
解决办法
3万
查看次数

TTimer.OnTimer事件处理程序是否可重入?

我的应用程序中有一个TTimer,每2秒触发一次,并调用我的事件处理程序HandleTimerEvent().HandleTimerEvent()函数修改共享资源,在返回之前可能需要10秒的时间才能执行.此外,我在事件处理程序中调用Sleep()有时放弃处理器.

我不确定C++构建器的TTimer对象在调用事件时是如何工作的,所以我刚才解释的场景让我思考,尤其是在先前的调用返回之前是否调用了HandleTimerEvent().

问题归结为几件事.

TTimer对象是否对事件进行排队?

在先前的调用返回之前,TTimer对象是否可以调用我的事件处理程序?

delphi c++builder

18
推荐指数
1
解决办法
2728
查看次数

GDI在第二个线程中使用TGIFImage处理泄漏

我有一个后台线程加载图像(从磁盘或服务器),目标是最终将它们传递给主线程进行绘制.当第二个线程使用VCL TGIFImage加载GIF图像时,每次在线程中执行以下行时,此程序有时会泄漏几个句柄:

m_poBitmap32->Assign(poGIFImage);
Run Code Online (Sandbox Code Playgroud)

也就是说,刚刚打开的GIF图像被分配给线程拥有的位图.这些都不与任何其他线程共享,即完全本地化到线程.它与时序有关,因此每次执行该行时都不会发生,但是当它确实发生时,它只发生在该行上.每个泄漏都是一个DC,一个调色板和一个位图.(我使用GDIView,它提供比Process Explorer更详细的GDI信息.) m_poBitmap32这是一个Graphics32 TBitmap32对象,但我使用普通的VCL专用类重现了这一点,即使用Graphics::TBitmap::Assign.

最终我得到一个EOutOfResources异常,可能表明桌面堆已满:

:7671b9bc KERNELBASE.RaiseException + 0x58
:40837f2f ; C:\Windows\SysWOW64\vclimg140.bpl
:40837f68 ; C:\Windows\SysWOW64\vclimg140.bpl
:4084459f ; C:\Windows\SysWOW64\vclimg140.bpl
:4084441a vclimg140.@Gifimg@TGIFFrame@Draw$qqrp16Graphics@TCanvasrx11Types@TRectoo + 0x4a
:408495e2 ; C:\Windows\SysWOW64\vclimg140.bpl
:50065465 rtl140.@Classes@TPersistent@Assign$qqrp19Classes@TPersistent + 0x9
:00401C0E TLoadingThread::Execute(this=:00A44970)
Run Code Online (Sandbox Code Playgroud)

如何TGIFImage在后台线程中解决此问题并安全使用?

其次,我会遇到PNG,JPEG或BMP类的同样问题吗?我还没有到目前为止,但鉴于它是一个线程/时间问题并不意味着如果他们使用相似的代码我就不会TGIFImage.

我正在使用C++ Builder 2010(RAD Studio的一部分.)


更多细节

一些研究表明,我不是唯一遇到这种情况的人.引用一个帖子,

Help(2007)说:在使用Lock保护画布的多线程应用程序中,所有使用画布的调用都必须通过调用Lock来保护.在使用之前没有锁定画布的任何线程都会引入潜在的错误.

[...]

但是这个陈述是绝对错误的:即使其他线程没有触摸它,你也必须在辅助线程中锁定画布.否则,画布的GDI句柄可以在主线程中随时释放(异步).

另一个回复表明类似的东西,它可能与graphics.pas中的GDI对象缓存有关.

这很可怕:在一个线程中完全创建和使用的对象可以在主线程中异步释放一些资源.不幸的是,我不知道如何应用Lock建议TGIFImage. TGIFImage没有Canvas,虽然它确实有Bitmap一个画布.锁定无效.我怀疑这个问题实际上是TGIFFrame一个内部课程.我也不知道是否或如何锁定任何TBitmap32资源.我确实尝试将TMemoryBackend位图分配给位图,这避免了使用GDI,但它没有任何效果.

再生产 …

delphi memory-leaks gdi c++builder thread-safety

16
推荐指数
1
解决办法
1560
查看次数

Delphi与C++ Builder - 对于Java程序员来说,这是Win32的最佳选择

我是一位经验丰富的Java程序员,在过去的几年里,他一直在做很多Win32的工作.主要是我一直在使用VB6,但我真的需要转向更好的东西.

我花了一个月左右玩Delphi 2009.我喜欢VCL GUI的东西,Delphi似乎比VB6更适合Windows API调用,我真的很喜欢OO比VB6好多了,我喜欢这个单元IDE附带的测试框架.

但是我真的很难为Delphi没有广泛使用的垃圾收集器这一事实 - 不得不手动释放每个对象或者使用接口来解决所有问题似乎对你以面向对象的方式有效地做事的方式产生了很大的影响.另外,我并不是特别热衷于语法,或者你必须在方法的顶部声明变量.

我可以处理Delphi,但我想知道C++ Builder 2009对我来说是否是更好的选择.我对C++ Builder和C++知之甚少,但我对Delphi知之甚少.我知道C++语言有很多东西,但我怀疑它只需要知道它的一个子集就可以有效地完成工作......我听说今天的C++编程比C++更高效. 10年前.

我将只进行新的开发,所以我不需要掌握C++语言的每个方面 - 如果我能找到每个Java语言功能的等价物,我会很高兴,随着我的进步,我可以开始寻找在更先进的东西更多.(对不起,如果这听起来很痛苦 - 如果是这样,请让我直截了当!)

那么,对于一个对Delphi和C++ Builder都不熟悉的Java程序员来说,你会认为它是Win32 exes和dll高效开发的更好选择,为什么?你认为每个人的利弊是什么?

c++ java delphi winapi c++builder

15
推荐指数
5
解决办法
1万
查看次数

用于本机C++开发的C++ Builder或Visual Studio?

我已经决定使用C++进行本机代码开发.我正在尝试使用CodeGear C++ Builder 2009或Visual Studio 2008来更好地服务.我目前使用的是Delphi 2007,因此我对C++ Builder的IDE(与Delphi相同)非常熟悉,以及VCL和RTL.

我从未成为MFC的忠实粉丝(从我第一次在VS 6.0中玩过它),但从那时起就没有仔细看过它.

我有兴趣听取一些有IDE经验的专家的意见,无论他们是否是最新版本.

现在,我倾向于使用C++ Builder,因为我相信VCL比MFC更强大,更容易使用 - 但正如我所说,自从我使用MFC以来已经有一段时间了.我对构建依赖于.NET Framework的程序不感兴趣,因为我部分地教自己本地开发.MFC仍然是Windows C++的王者吗?或者WTL或ATL是重要的东西?

那里的任何C++大师想分享他们的意见吗?

编辑:我知道MFC不是Visual Studio唯一的gui工具包.但是,我正在寻找基于GUI工具包+ IDE的一些建议.对于C++ Builder,只有一个真正的选项,即C++ Builder + VCL.对于VS 2008,它是VS + MFC/ATL/WTL/QT ......因为我对它们不太了解而对我感到困惑.

c++ c++builder visual-studio

15
推荐指数
5
解决办法
2万
查看次数

如何在没有有用的调用堆栈的情况下调试难以重现的崩溃?

我在软件中遇到了一个奇怪的崩溃,我在调试它时遇到了很多麻烦,因此我正在寻求如何解决它的建议.

崩溃是读取NULL指针的访问冲突:

$ 00CF0041的第一次机会异常.异常类$ C0000005,消息'访问冲突位于0x00cf0041:读取地址0x00000000'.

它只发生'有时' - 我还没有设法找出任何押韵或理由,但是,当时 - 并且只在主线程中.当它发生时,调用堆栈包含一个不正确的条目:

用一行调用堆栈,Classes :: TList :: Get,地址0x00cf0041

对于主线程,它应该显示一个充满其他项目的大堆栈.

此时,所有其他线程都处于非活动状态(主要是坐在WaitForSingleObject或类似的功能.)我只看到这个崩溃发生在主线程中.它始终具有一个条目的相同调用堆栈,在同一地址的相同方法中.此方法可能相关也可能不相关 - 我们在应用程序中使用VCL.不过,我的赌注是,某些东西(可能是很久以前)正在破坏堆栈,而崩溃的地址实际上是随机的.请注意,它在几个版本中的地址相同 - 但它可能不是真正随机的.

这是我尝试过的:

  • 试图在某一点可靠地再现它.我没有发现任何东西每次都会重现它,以及偶尔做或不做的一些事情,没有明显的理由.这些并不是"狭隘"的足以将其缩小到特定代码段的行为.它可能与时间有关,但在IDE中断的时候,其他线程通常什么都不做.我不能排除线程问题,但认为这不太可能.
  • 使用额外的调试语句构建(额外的调试信息,额外的断言等).这样做之后,崩溃永远不会发生.
  • 在启用Codeguard的情况下构建.执行此操作后,崩溃永远不会发生,Codeguard没有显示错误.

我的问题:

1.如何找到导致崩溃的代码?我怎么做相当于走回堆栈?

2.对于如何追踪此次崩溃的原因,您有什么一般性的建议?

我正在使用Embarcadero RAD Studio 2010(该项目主要包含C++ Builder代码和少量Delphi.)

编辑:我想我应该添加实际导致这个的东西.有一个线程调用ReadDirectoryChangesW然后,使用GetOverlappedResult,等待事件继续并对更改执行某些操作.事件也发出信号,以便在设置状态标志后终止线程.问题是当线程退出时它从未调用过CancelIO.因此,Windows仍在跟踪更改,并且可能仍然在目录更改时写入缓冲区,即使缓冲区,重叠的结构和事件不再存在(也没有创建它们的线程上下文.)CancelIO调用时,没有更多的崩溃.

delphi crash callstack c++builder

15
推荐指数
1
解决办法
5442
查看次数

Eclipse CDT:未解决的stl标头包含

我正在尝试使用Eclipse编辑源代码,在C++ Builder下编译,但遇到Unresolved inclusion问题.

例如,代码如:

#include <vector>
Run Code Online (Sandbox Code Playgroud)

Unresolved inclusion: <vector>在Eclipse IDE中给出错误.C++ Builder确实没有vector文件,而是vector.h编译器使用的文件.

如果我写的话Eclipse IDE没有错误

#include <vector.h>
Run Code Online (Sandbox Code Playgroud)

如何让Eclipse vector.h在看到时使用#include <vector>

c++ eclipse eclipse-cdt c++builder header-files

15
推荐指数
2
解决办法
4万
查看次数

如何禁用"光标超出行尾"?

如何停用Delphi的"超出行尾的光标"功能?当我单击一行右侧的空白区域时,或者当我使用箭头键导航到一行时,我希望光标位于该行的实际末尾,而不是"虚拟空间".

ide delphi c++builder

15
推荐指数
1
解决办法
1631
查看次数

Rad Studio调试器线程中的未处理异常

我有一个大型应用程序,最近开始在调试器中运行时表现出相当奇怪的行为.一,基础知识:

OS: Windows 7 64-bit.
Application: Multithreaded VCL app with many dlls, bpls, and other components.
Compiler/IDE: Embarcadero RAD Studio 2010.
Run Code Online (Sandbox Code Playgroud)

观察到的症状是这样的:当调试器附加到我的应用程序时,某些任务会导致应用程序崩溃.这些细节进一步令人困惑:我的应用程序因Windows消息"YouApplication已停止工作"而停止.它有助于向微软发送一个小型转储.

应该注意:当未附加调试器时,应用程序不会崩溃.此外,调试器在应用程序运行时不会指示任何异常或其他问题.

设置和单步执行断点似乎会影响应用程序崩溃的点,但我怀疑这是调试线程而不是有问题的线程的症状.

这些崩溃也发生在我同事的计算机上,我观察到同样的行为.这使我不怀疑在我的计算机上安装了某些东西失败了.遇到此问题的同事也在运行Windows 7 64位.我没有同事没有遇到这个问题.

我从崩溃中收集了一些已分析的完整转储.我发现失败实际上每次都发生在同一个地方.这是来自转储的异常数据(它总是相同的,当然除了ThreadId):

Exception Information

ThreadId:         0x000014C0
Code:             0x4000001F Unknown (4000001F)
Address:          0x773F2507
Flags:            0x00000000
NumberParameters: 0x00000001
    0x00000000
Run Code Online (Sandbox Code Playgroud)

Google透露,代码0x4000001F实际上是STATUS_WX86_BREAKPOINT.Microsoft无益地将其描述为"Win32 x86仿真子系统使用的异常状态代码".

这是堆栈详细信息(似乎没有变化):

0x773F2507: ntdll.dll+0x000A2507: RtlQueryCriticalSectionOwner + 0x000000E8
0x773F3DAB: ntdll.dll+0x000A3DAB: RtlQueryProcessLockInformation + 0x0000020D
0x773D2ED9: ntdll.dll+0x00082ED9: RtlUlonglongByteSwap + 0x00005C69
0x773F3553: ntdll.dll+0x000A3553: RtlpQueryProcessDebugInformationRemote + 0x00000044
0x74F73677: kernel32.dll+0x00013677: BaseThreadInitThunk + 0x00000012
0x77389F02: ntdll.dll+0x00039F02: RtlInitializeExceptionChain + 0x00000063
0x77389ED5: ntdll.dll+0x00039ED5: RtlInitializeExceptionChain + …
Run Code Online (Sandbox Code Playgroud)

c++ dll exception c++builder c++builder-2010

14
推荐指数
2
解决办法
3148
查看次数

64位系统上更大指针的好处是什么?

我试图理解64位编译,所以我在C++ Builder中做了一点测试:

  int i = 12345;
  ShowMessage(i);
  int *pi = &i;
  ShowMessage(sizeof(pi));


  Largeint li = 9223372036854775807;
  ShowMessage(li);
  Largeint *pli = &li;
  ShowMessage(sizeof(pli));
Run Code Online (Sandbox Code Playgroud)

当我将此程序编译为64位时,指针的大小增加到8个字节(64位).

指针大小增加的优点是什么?

c++ 64-bit pointers c++builder

14
推荐指数
2
解决办法
2367
查看次数