[RQt-devel] possible bug in qtbase
Deepayan Sarkar
deepayan.sarkar at gmail.com
Wed Sep 21 18:07:24 CEST 2011
On Wed, Sep 21, 2011 at 7:22 PM, Michael Lawrence
<lawrence.michael at gene.com> wrote:
>
>
> On Tue, Sep 20, 2011 at 9:48 PM, Michael Lawrence <michafla at gene.com> wrote:
>>
>>
>> On Tue, Sep 20, 2011 at 7:40 PM, Deepayan Sarkar
[...]
>>> Here goes. Adding the gc() makes the whole thing work fine. The
>>> trivial qpen() call is required.
>>>
>>
>> Thanks a lot. Will look at this.
>>
>>>
>>> #----
>>> library(qtbase)
>>>
>>> v <- Qt$QGraphicsView()
>>> v$size <- qsize(300, 300)
>>> scene <- Qt$QGraphicsScene()
>>> v$setScene(scene)
>>> v$show()
>>>
>>> doplot <- function(view, scene)
>>> {
>>> ## gc()
>>> scene$clear()
>>> x <- runif(2, 50, 250)
>>> scene$addEllipse(x[1], x[2], 10, 10, qpen())
>>> Sys.sleep(0.01)
>>> }
>>>
>
> The issue is that scene$clear() frees all objects, including the ellipse,
> but since Qt constructed the QGraphicsEllipseItem, we have no way of knowing
> that it has been freed, and so we cannot clear the pointer out of the hash.
> The fix yesterday made it so that if the R object was garbage collected, the
> pointer would be cleared in this situation. It may be that we can get away
> without adding such pointers to the hash at all, i.e., we would create a new
> wrapper object every time we see them. That will take a lot of thought
> though about the myriad of consequences.
Makes sense. My first attempt had been replacing view$scene() by a new
scene each time, and that had no problems.
I will go back to that approach for now.
-Deepayan
>
> Please stand by.
>
> Michael
>
>
>>>
>>> niter <- 0L
>>> while (TRUE)
>>> {
>>> doplot(view = v, scene = scene)
>>> niter <- niter + 1
>>> cat(niter, fill = TRUE)
>>> }
>>> #----
>>>
>>> I'm usually getting an error within 10 iterations.
>>>
>>> -Deepayan
>>
>
>
More information about the Qtinterfaces-devel
mailing list