- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
void MeasureWorker::measure()
{
QVector< QVector<double> > *S12_AmplitudeCurveArray = new QVector< QVector<double> >;
QVector<double> *S11_Amplitudes = new QVector<double>;
mutex = new QMutex();
if (!running) {
return;
}
switch(mode) {
case AUTO_MODE: {
if (type == SofNum) {
if (!readSofNum()) {
if (deviceProblem) {
closeDevices();
stop();
}
}
}
if (type == SofFreq) {
if (!readSofFreq(S12_AmplitudeCurveArray, S11_Amplitudes)) {
if (deviceProblem) {
closeDevices();
stop();
}
}
}
// Дальше пока что неинтересно...
bool MeasureWorker::readSofFreq(QVector<QVector<double> > *S12_AmplitudeCurveArray,
QVector<double> *S11_AmplitudeCurve)
{
if (selectedChannel.CH1) {
if (!oneReadSofFreq(S11_AmplitudeCurve,
S12_AmplitudeCurveArray, 1)) {
return false;
}
} else {
mutex->lock();
S12_AmplitudeCurveArray->append(QVector<double>(NP51, 0.0));
try {
r4m->setSweepParams(START, STOP, NP51);
r4m->startSweep();
QVector<ComplexType> freqS11 = r4m->getData("s22");
if (freqS11.isEmpty()) {
throw std::invalid_argument("freqS11 is empty");
}
for(ComplexType complex : freqS11) {
S11_AmplitudeCurve->append(complex.toLogAmp());
}
} catch(std::exception &e) {
r4m->error(e.what());
deviceProblem = true;
return false;
}
mutex->unlock();
emit updateGraphS11f(S11_AmplitudeCurve);
Sleep(TIME_SHIFT);
}
// ...
- А если... дидлок?
- Та похуй... там всёрно каждый раз новый мьютекс создается...
Небось, с сишарпа пересели? Никогда не понимал, зачем выделять локальные переменные через new. Тупость же.
(Инфа старая, времен qt4.)
Here's an example of using the C++ API
Хотя хоть в коде к книге, который можно загрузить с сайта, такого треша почему-то нет.
Но может быть они хотели показать операторы new и delete?
Ed: Хотя фиг знает, скорее всего этот QVector и сам по себе никогда на стек не попадает.
wvxvw тоже небось так и не знает, что не мешает ему писать простыни и обзывать всех вокруг дебилами
Да дошло же уже, причём довольно быстро, см. Ed.
Очень давно кресты не трогал, а в няшной локальные массивы вполне себе на стек попадают, сработал рефлекс.
>> с сишарпа пересели
> после курса джавы
Собственно, я почти угадал.
И потому студентов джаве надо учить ПОСЛЕ сей, чтобы они сначала поняли что такое стек и куча, и как память работает, а не просто тупо копировали слово "new" как какую-то мантру
Это я потом узнал про vm)
Cоздавать объекты на стеке, а не в куче
The Java language does not offer any way to explicitly allocate an object on the stack, but this fact doesn't prevent JVMs from still using stack allocation where appropriate. JVMs can use a technique called escape analysis, by which they can tell that certain objects remain confined to a single thread for their entire lifetime, and that lifetime is bounded by the lifetime of a given stack frame. Such objects can be safely allocated on the stack instead of the heap. Even better, for small objects, the JVM can optimize away the allocation entirely and simply hoist the object's fields into registers.
-- http://www.ibm.com/developerworks/java/library/j-jtp09275/index.html
А она разве умеет всю? Вроде анализ утечек у нее весьма тупой - только на одну функцию.
А потом расплатк в виде гц
Да в общем-то почти бесплатно, если объекты живут либо совсем мало либо очень долго. Дорого стоят только объекты, которые 2-3 сборки переживают и дохнут...