I committed a very crude fix which replaces repaint() with waveformChanged =
true and then adds an if (waveformChanged) { repaint(); waveformChanged =
false; } block to the beginning of the existing paintEvent() method.
The trade off is that waveforms are loaded with the next UI update to that
region... on my PC that's virtually the same as explicitly calling repaint()
from the waveSummary thread.
On the upside I was able to quickly load 50 or 60 songs without killing the
UI thread... yay! :D
On Mon, Apr 28, 2008 at 7:03 AM, Garth Dahlstrom <[EMAIL PROTECTED]>
wrote:
>
> FYI... Here is the start of our repaint() method:
>
> 108 void WOverview::repaint() {
> 109 if (!m_pWaveformSummary || !m_pWaveformSummary->size())
> 110 return;
> 111
> 112 QPainter paint;
> 113 paint.begin(m_pScreenBuffer, this);
> 114
> 115 // Erase background
> 116 paint.eraseRect(rect());
> 117
> 118 float yscale = (((float)(height()-2)/2.)/128. ); //32768.;
> 119 float xscale = (float)m_pWaveformSummary->size()/width();
>
> The block from the bottom of this posting looks promising:
> http://lists.trolltech.com/qt-interest/2005-03/thread00136-0.html#msg00182
>
> QWaitCondition renderingDone;
> >
> > // thread which rotates the model, even if user doesn't interact
> >
> > // with the mouse
> > MyQGLWidget::run()
> > {
> >
> > ...
> > updateScene(); // rotate, translate etc
> > // inform the GUI thread that this widget needs to be
> > // repainted
> > qApp->postEvent (this,
> >
> > new QPaintEvent(QRegion (QRect (this->rect())),
> > false));
> > ...
> > // wait until previous rendering has finished
> > renderingDone.wait();
> >
> > }
> >
> > void MyQGLWidget::paintEvent (QPaintEvent *pe) {
> >
> > QGLWidget::paintEvent (pe);
> >
> > ...
> > if (doRotate == true) {
> > // inform the thread to render the next frame
> > renderingDone.wakeOne();
> >
> > }
> > ...
> > }
> >
> >
> Guess we could put the post event in setData() instead of the call
> repaint(), then rename repaint to paintEvent.... or something...
>
>
>
>
> On Mon, Apr 28, 2008 at 2:05 AM, Garth Dahlstrom <[EMAIL PROTECTED]>
> wrote:
>
> > I get hit by XLib errors every so often... They seem to occur during
> > track loads and they lock up the UI thread.
> >
> > Decided to take a poke around in the code after looking at this post:
> > http://lists.trolltech.com/qt-interest/2005-05/msg00702.html
> >
> > Here's what I found:
> >
> > Around line #155 of wavesummary.cpp we call:
> > pTrackInfoObject->setWaveSummary(pData, 0);
> >
> > If I comment out this line, I can load tracks very aggressively and I
> > don't get XLib errors. (of course, I don't get wave summarys either)
> >
> > setWaveSummary is defined here:
> >
> > 851 void TrackInfoObject::setWaveSummary(Q3MemArray<char> * pWave,
> > Q3ValueList<long> * pSegmentation)
> > 852 {
> > 853 m_qMutex.lock();
> > 854 m_pWave = pWave;
> > 855 m_pSegmentation = pSegmentation;
> > 856 m_qMutex.unlock();
> > 857
> > 858 setOverviewWidget(m_pOverviewWidget);
> > 859 }
> >
> > It calls
> >
> > 875 void TrackInfoObject::setOverviewWidget(WOverview * p)
> > 876 {
> > 877 m_pOverviewWidget = p;
> > 878
> > 879 if (m_pOverviewWidget)
> > 880 p->setData(getWaveSummary(), getSegmentationSummary(),
> > getDuration()*getSampleRate()*getChannels());
> > 881 }
> >
> > That calls:
> >
> > 99 void WOverview::setData(Q3MemArray<char> * pWaveformSummary,
> > Q3ValueList<long> * pSegmentation, long liSampleDuration)
> > 100 {
> > 101 m_pWaveformSummary = pWaveformSummary;
> > 102 m_pSegmentation = pSegmentation;
> > 103 m_liSampleDuration = liSampleDuration;
> > 104
> > 105 repaint();
> > 106 }
> >
> > So to me it looks like the wave summary thread is making a call to paint
> > the widget directly, something the mailing list post suggests is a bad idea
> > to do outside the main UI thread...
> >
> > Now, I have to read a bit more about sending QEvents around...
> >
> > --
> > __
> > --- == __/ t.O ==--
> > http://stacktrace.org/
>
>
>
>
> --
> __
> --- == __/ t.O ==--
> http://stacktrace.org/
>
--
__
--- == __/ t.O ==--
http://stacktrace.org/
-------------------------------------------------------------------------
This SF.net email is sponsored by the 2008 JavaOne(SM) Conference
Don't miss this year's exciting event. There's still time to save $100.
Use priority code J8TL2D2.
http://ad.doubleclick.net/clk;198757673;13503038;p?http://java.sun.com/javaone
_______________________________________________
Mixxx-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/mixxx-devel