Skip to content

Commit

Permalink
Merge pull request #1013 from vasole/isRunning
Browse files Browse the repository at this point in the history
[XRF] Correct threading issue under MacOS
  • Loading branch information
vasole committed Jun 16, 2023
2 parents 92a613f + 08e56c7 commit 8f3b074
Show file tree
Hide file tree
Showing 6 changed files with 67 additions and 126 deletions.
81 changes: 17 additions & 64 deletions PyMca5/PyMcaGui/math/NNMADialog.py
Original file line number Diff line number Diff line change
Expand Up @@ -33,36 +33,14 @@
import time
import logging
from PyMca5.PyMcaGui import PyMcaQt as qt
if sys.platform.startswith("darwin"):
import threading
QThread = threading.Thread
else:
QThread = qt.QThread

from PyMca5.PyMcaGui.misc import CalculationThread
from . import NNMAWindow
NNMA = True


_logger = logging.getLogger(__name__)


class SimpleThread(QThread):
def __init__(self, function, *var, **kw):
if kw is None:kw={}
QThread.__init__(self)
self._function = function
self._var = var
self._kw = kw
self._result = None

def run(self):
try:
self._result = self._function(*self._var, **self._kw )
except Exception:
if _logger.getEffectiveLevel() == logging.DEBUG:
raise
self._result = ("Exception",) + sys.exc_info()

class NNMADialog(qt.QDialog):
def __init__(self, parent=None, rgbwidget=None, selection=False):
qt.QDialog.__init__(self, parent)
Expand Down Expand Up @@ -203,47 +181,22 @@ def setData(self, data=None, spectrumindex=-1):

def _submitThread(self, function, *var, **kw):
message = "Please Wait: NNMA Going On"
sthread = SimpleThread(function, *var, **kw)
return self._startThread(sthread, message)

def _startThread(self, sthread, message):
sthread.start()
if 0:
msg = qt.QDialog(self, qt.Qt.FramelessWindowHint)
msg.setModal(0)
else:
msg = qt.QDialog(self, qt.Qt.FramelessWindowHint)
msg.setModal(1)
msg.setWindowTitle("Please Wait")
layout = qt.QHBoxLayout(msg)
layout.setContentsMargins(0, 0, 0, 0)
layout.setSpacing(0)
l1 = qt.QLabel(msg)
l1.setFixedWidth(l1.fontMetrics().maxWidth()*len('##'))
l2 = qt.QLabel(msg)
l2.setText("%s" % message)
l3 = qt.QLabel(msg)
l3.setFixedWidth(l3.fontMetrics().maxWidth()*len('##'))
layout.addWidget(l1)
layout.addWidget(l2)
layout.addWidget(l3)
msg.show()
qApp = qt.QApplication.instance()
qApp.processEvents()
i = 0
ticks = ['-','\\', "|", "/","-","\\",'|','/']
while (sthread.isRunning()):
i = (i+1) % 8
l1.setText(ticks[i])
l3.setText(" "+ticks[i])
qApp = qt.QApplication.instance()
qApp.processEvents()
time.sleep(2)
msg.close()
result = sthread._result
del sthread
self.raise_()
return result
thread = CalculationThread.CalculationThread(
calculation_method=function,
calculation_vars = var,
calculation_kw = kw,
expand_vars=True,
expand_kw=True)
thread.start()
CalculationThread.waitingMessageDialog(thread,
message=message,
parent=self,
modal=True
update_callback=None,
frameless=True)
threadResult = thread.getResult()
self.raise_()
return threadResult

if __name__ == "__main__":
import os
Expand Down
77 changes: 17 additions & 60 deletions PyMca5/PyMcaGui/math/PCADialog.py
Original file line number Diff line number Diff line change
Expand Up @@ -33,11 +33,7 @@
import numpy
import logging
from PyMca5.PyMcaGui import PyMcaQt as qt
if sys.platform.startswith("darwin"):
import threading
QThread = threading.Thread
else:
QThread = qt.QThread
from PyMca5.PyMcaGui.misc import CalculationThread

try:
from . import PCAWindow
Expand All @@ -49,24 +45,6 @@

_logger = logging.getLogger(__name__)

class SimpleThread(QThread):
def __init__(self, function, *var, **kw):
if kw is None:
kw = {}
QThread.__init__(self)
self._function = function
self._var = var
self._kw = kw
self._result = None

def run(self):
try:
self._result = self._function(*self._var, **self._kw)
except Exception:
if _logger.getEffectiveLevel() == logging.DEBUG:
raise
self._result = ("Exception",) + sys.exc_info()


class PCADialog(qt.QDialog):
def __init__(self, parent=None, rgbwidget=None, selection=False):
Expand Down Expand Up @@ -245,43 +223,22 @@ def setSpectrum(self, x, y, legend=None):

def _submitThread(self, function, *var, **kw):
message = "Please Wait: PCA Going On"
sthread = SimpleThread(function, *var, **kw)
return self._startThread(sthread, message)

def _startThread(self, sthread, message):
sthread.start()
msg = qt.QDialog(self, qt.Qt.FramelessWindowHint)
msg.setModal(1)
msg.setWindowTitle("Please Wait")
layout = qt.QHBoxLayout(msg)
layout.setContentsMargins(0, 0, 0, 0)
layout.setSpacing(0)
l1 = qt.QLabel(msg)
l1.setFixedWidth(l1.fontMetrics().maxWidth()*len('##'))
l2 = qt.QLabel(msg)
l2.setText("%s" % message)
l3 = qt.QLabel(msg)
l3.setFixedWidth(l3.fontMetrics().maxWidth()*len('##'))
layout.addWidget(l1)
layout.addWidget(l2)
layout.addWidget(l3)
msg.show()
qApp = qt.QApplication.instance()
qApp.processEvents()
i = 0
ticks = ['-', '\\', "|", "/", "-", "\\", '|', '/']
while (sthread.isRunning()):
i = (i + 1) % 8
l1.setText(ticks[i])
l3.setText(" " + ticks[i])
qApp = qt.QApplication.instance()
qApp.processEvents()
time.sleep(2)
msg.close()
result = sthread._result
del sthread
self.raise_()
return result
thread = CalculationThread.CalculationThread(
calculation_method=function,
calculation_vars = var,
calculation_kw = kw,
expand_vars=True,
expand_kw=True)
thread.start()
CalculationThread.waitingMessageDialog(thread,
message=message,
parent=self,
modal=True
update_callback=None,
frameless=True)
threadResult = thread.getResult()
self.raise_()
return threadResult

if __name__ == "__main__":
_logger.setLevel(logging.DEBUG)
Expand Down
15 changes: 14 additions & 1 deletion PyMca5/PyMcaGui/physics/xrf/ConcentrationsWidget.py
Original file line number Diff line number Diff line change
Expand Up @@ -40,8 +40,10 @@
if sys.platform.startswith("darwin"):
import threading
QThread = threading.Thread
QTHREAD = False
else:
QThread = qt.QThread
QTHREAD = True

if hasattr(qt, 'QString'):
QString = qt.QString
Expand Down Expand Up @@ -223,20 +225,31 @@ class SimpleThread(QThread):
def __init__(self, function, *var, **kw):
if kw is None:
kw = {}
QThread.__init__(self)
if QTHREAD:
QThread.__init__(self, None)
else:
QThread.__init__(self)
self._threadRunning = False
self._function = function
self._var = var
self._kw = kw
self._result = None

if not QTHREAD:
def isRunning(self):
return self._threadRunning

def run(self):
if _logger.getEffectiveLevel() == logging.DEBUG:
self._result = self._function(*self._var, **self._kw)
else:
try:
self._threadRunning = True
self._result = self._function(*self._var, **self._kw)
except Exception:
self._result = ("Exception",) + sys.exc_info()
finally:
self._threadRunning = False


class ConcentrationsWidget(qt.QWidget):
Expand Down
2 changes: 1 addition & 1 deletion PyMca5/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@
__contact__ = "sole@esrf.fr"
__license__ = "MIT"
__copyright__ = "European Synchrotron Radiation Facility, Grenoble, France"
__version__ = "5.8.5"
__version__ = "5.8.6"

import os
import sys
Expand Down
13 changes: 13 additions & 0 deletions PyMca5/tests/McaAdvancedFitWidgetTest.py
Original file line number Diff line number Diff line change
Expand Up @@ -166,6 +166,19 @@ def _workOnBackend(self, backend):
"Peaks spectrum not working!!")

time.sleep(1)

# calculate concentrations
tabBar = widget.mainTab.tabBar()
idx = -1
for i in range(tabBar.count()):
if tabBar.tabText(i).lower().startswith("concentrations"):
idx = i
break
self.assertTrue(idx >= 0, "CONCENTRATIONS tab not found!!")
tabBar.setCurrentIndex(idx)
widget._tabChanged(idx)
time.sleep(1)

from PyMca5.PyMcaGui.plotting import PyMcaPrintPreview
PyMcaPrintPreview.resetSingletonPrintPreview()

Expand Down
5 changes: 5 additions & 0 deletions changelog.txt
Original file line number Diff line number Diff line change
@@ -1,3 +1,8 @@
VERSION 5.8.6
-------------

- XRF. Correct threading issue on MacOS introduced in version 5.8.2

VERSION 5.8.5
-------------

Expand Down

0 comments on commit 8f3b074

Please sign in to comment.