使用的控件是suiImageButton,载入了png格式没问题,编译也没问题,但是运行程序的时候却出现了以下问题
Project raised exception calss EConvertError with message 'Cannot assign a TPicture to a TBitmap'
在用TImage载入.png格式图片的时候没问题。
记得以前在使用其他ImageButton的时候都有问题,所以现在使用的TImage的 OnButtonUp()和OnButtonDown()方法来实现图片按钮。我是直接用控件自带的功能载入图片的....没有手动代码
我没有用过这个,但是从出错提示上看是你assign的操作不对,你把对图片assign的操作改一下看看
看你的意思是线程1停下,然后线程2开始执行,那你是如何让线程2知道线程1停下了? 是否是线程之间的通信出问题了?
控制多个线程的执行可以参考临界区,互斥等多种手段
两个是各有一个画面,只有线程1的在动,线程2只有在线程1显示完一次之后(从DLL的函数中退出来,执行自己的SLEEP)时,才会动50MS,接着又是线程1的了.
举个例子,DLL里面把一个文件夹里面图片读一张出来,显示到线程1的image里面,然后Sleep(1000),接着读下一张.直到这个文件夹里面的10张图片都显示完了之后退出来. 线程1里面 Sleep(2000),然后回到前面重来一次.
线程2也是一样,只不过是另一个文件夹,用的是DLL的同一个函数,也是读一张图片Sleep(1000);
现在的现象是线程1显示10次之后,线程2才会显示2次,接着线程1再显示10次,线程2再显示2次...
注:只是举这个例子,并不是要实现这个功能,所以不用讨论用其它方法实现读文件夹图片.
主要是里面显示完一张图片Sleep(1000)的时候,线程2为什么无法运行?而必须等到10张全显示完退出函数后,运行到线程1自己的Sleep(2000)的时候,线程2才可以运行.
你的意思是让1和2轮流在Imgae显示图片,好像是1显示完就轮到2显示了.是吧?
如果是这样的话,我认为使用sleep决定那个显示是不确定的,因为到底要显示那个是有系统根据处理消息的机制来确定的,你并没有确定1和2的执行顺序啊
线程1读出一张sleep(1000)的时候,应该让出来让线程2也读一张吧.然后线程2也sleep(1000),接着线程1再读下一张.. 至于哪个先一点,哪个后一点无所谓.
现在问题是线程1读1张后sleep,线程2并不执行,而必须等10张完了后退出到线程的SLEEP(2000)的时候才能运行2000ms
不知道多核能否实行同时,现在的win处理消失是排队处理的
我认为你的问题依然是想要使用Sleep去控制两个线程的执行顺序,还是那句系统不会按照你的想法去做的,使用临界区,互斥,信号量等手段去控制吧.
互斥控制是为了避免一个线程在使用某一个对象或全局变量与其他线程发生冲突。实现线程互斥的方法有:
(1) 访问代码委托给VCL主线程执行。在线程中若要调用可视化的方法或访问其属性,可将执行代码委托给VCL主线程执行,否则会发生并发访问冲突。委托的方法是先将使用可视化组件的代码单独编成一个函数,函数原型是void 函数名(void),然后电泳TThread类的成员函数Synchronize(函数名)来调用它,VCL主线程顺序执行所有组建对该组建的访问(包括响应人机界面事件、windows系统事件等),从而不会发生冲突。
(2) 使用对象锁。有些VCL类提供对象锁,可以使用对象的LOCK与UNLOCK方法进行加锁与解锁。当访问这些对象时,可调用LOCK方法锁住对象,然后访问该对象,访问完毕后调用对象的UNLOCK方法释放该对象。
(3) 使用临界区对象。若要访问一个全局变量,则可设置一个临界区对象(TCritical Section)来实现互斥,该对象有Acquire与Release两个方法。Acquire方法阻塞其他线程,执行临界区代码,而Release方法释放等待进入临界区的线程。例如:设Q为全局变量,Crit1为临界区对象,在访问Q进入临界区时须执行Crit1.Acquire(),访问后退出临界区时须执行Crit1.Release()。
来源:足球直播