PDA

View Full Version : مبتدی: ارور c++ runtime و اجرا نشدن برنامه



raminlich
پنج شنبه 13 شهریور 1393, 00:41 صبح
سلام
این برنامه
#include "mainwindow.h"
#include <QApplication>
#include <QSystemTrayIcon>
#include <QMenu>
#include <QAction>
#include <QFileDialog>
#include <QMessageBox>
#include <thread>
#include <fstream>
#include <QTextStream>
#include <time.h>
#include <windows.h>
using namespace std;



const tm* timeinfos;
void tray();
void refresh();
void starts();
void wait();
ofstream dif("d:\\dif.txt");
const char* const path = "d:\\dif.txt" ;
void starts();
int hour=0,minu=0;
ofstream times("d:\\time.txt");
struct tm * timeinfo;
time_t rawtime = time(0) ;
int sec,secd;
MainWindow w;



int main(int argc, char *argv[])
{
QApplication a(argc, argv);
w.hide();
std::thread first(tray);
std::thread second(starts);
std::thread third(refresh);
starts();
first.join();
third.join();

return a.exec();
}


void tray(){
QSystemTrayIcon *trayIcon=new QSystemTrayIcon();
QMenu *menu=new QMenu("TimeUsage");
menu->addAction("Open");
menu->addAction("Exit");
trayIcon->setContextMenu(menu);
trayIcon->setIcon(QIcon("e:\\icon.png"));
trayIcon->show();
trayIcon->showMessage("TimeUsage","TimeUsage Is Here!");

QObject::connect(menu,&QMenu::triggered,[&w](QAction* act){

const auto& text = act->text();
if(text=="Exit"){
QApplication::exit();
}
else if(text=="Open"){
w.show();
}


});
}


void refresh(){
for(;;){
wait();
time_t now = time(0) ;
ifstream dif(path);
time_t earlier = 0 ;
dif >> earlier ;

double secs = difftime( now, earlier );
minu=secs/60;
while(minu>60){
minu-=60;
hour++;
}
QFile times("d:\\time.txt");
times.open(QIODevice::Append);
QTextStream stream(&times);
stream<<asctime(timeinfos)<<endl<<hour<<"/"<<minu<<endl;
}
}


void starts(){
timeinfos = localtime ( &rawtime );

ofstream dif(path);
dif << rawtime << '\n' ;
dif.close();
refresh();
}


void wait(){
int i;
for (i=0; i<=10; ++i) {
this_thread::sleep_for (chrono::seconds(1));
}
}


کامپایل میشه ولی این ارور میاد ولی موقع اجرا این می یاد:عصبانی++:
123064

motherboard
پنج شنبه 13 شهریور 1393, 00:50 صبح
اقا رامین جدا این رو خودت نوشتی و یا از جایی کپی پیست کردی؟ ولی اگه خودت نوشته باشی کارت درسته.خوب راه افتادی.ای ول تو که این قدر بلدی بیا به سوال های من هم جواب بده دیگه.:تشویق:

حامد مصافی
پنج شنبه 13 شهریور 1393, 01:00 صبح
پروژه رو Clean کن و بعد در حالت دیباگ کامپایل و اجرا کن تا متن خطای بهتری ببینی

omid_kma
پنج شنبه 13 شهریور 1393, 01:44 صبح
system tray مربوط میشه به gui نباید بزاریش داخل یک thread دیگه .
ضمنا با توجه به کدی که نوشتید thread ها رو باید detach کنی نه join

motherboard
پنج شنبه 13 شهریور 1393, 01:53 صبح
ضمنا با توجه به کدی که نوشتید thread ها رو باید detach کنی نه join
منظورت چی هست؟

raminlich
پنج شنبه 13 شهریور 1393, 02:01 صبح
اقا رامین جدا این رو خودت نوشتی و یا از جایی کپی پیست کردی؟ ولی اگه خودت نوشته باشی کارت درسته.خوب راه افتادی.ای ول تو که این قدر بلدی بیا به سوال های من هم جواب بده دیگه.:تشویق:

راستش اینو اره خودم نوشتم ولی تو دراز مدت هر کدوم از تابع هایی به غیر از ماین که دیروز یادش گرفتم رو از چند تا برنامه دیگه که اونا رو هم خودم نوشتم کپی پست کردم بخواتر همین یخورده وحشتناک به نظر میاد :لبخند: خودمم باورم نمی شه اینارو نوشتم ولی چیز سختی نی
کافی بری تو سایت cplusplus.cpm (http://cplusplus.com)
اینارو بخونی
thread
chrono
time.h
که اینا هم چیز زیاد سختی نیست

omid_kma
پنج شنبه 13 شهریور 1393, 02:07 صبح
join میگه thread ای که داخلشیم صبر کنه تا thread مورد نظر کارش تموم بشه
detach یعنی thread رو به حال خودش رها کنیم .
توضیحات کاملتر + مثال
http://en.cppreference.com/w/cpp/thread/thread/join
http://en.cppreference.com/w/cpp/thread/thread/detach

motherboard
پنج شنبه 13 شهریور 1393, 02:16 صبح
اینارو بخونی
thread
chrono
time.h
که اینا هم چیز زیاد سختی نیست
تا اونجا که یادمه این ها از مباحث و کتابخانه های استاندارد است.به نظر من این کد هیچ وقت کار نمی کنه.به دلیل اینکه هم از هم از ویجت داری بهره می بری و هم از یک سری دستورات پایه ++c.

raminlich
پنج شنبه 13 شهریور 1393, 02:25 صبح
یه تاپیک زده بودم در مورد جایگزین ios::app تو Qt آقای اسدزاده گفت می تونی از خوده ios::app تو برنامه ها استفاده کنی البته شاید فکر کرده من دارم کنسول می نویسم.
یعنی روشه خوبی نیست هم از کتابخونه های استاندارد استفاده کنم و هم از ویدجت؟:ناراحت:

motherboard
پنج شنبه 13 شهریور 1393, 02:32 صبح
معلومه که روش خوبی نیست.هر چه را بهر کاری ساخته اند.الان مثلا تو کنسول مدام از cout استفاده میشه.در حالی که در دسکتاب جایگزین های بهتری مثل qDebug وجود داره.

raminlich
پنج شنبه 13 شهریور 1393, 15:38 عصر
تا اونجا که یادمه این ها از مباحث و کتابخانه های استاندارد است.به نظر من این کد هیچ وقت کار نمی کنه.به دلیل اینکه هم از هم از ویجت داری بهره می بری و هم از یک سری دستورات پایه ++c.
بفرما برنامه با C++‎‎‎ standard اجرا میشه مثل هلو
#include "mainwindow.h"
#include <QApplication>
#include <QSystemTrayIcon>
#include <QMenu>
#include <QAction>
#include <QFileDialog>
#include <QMessageBox>
#include <thread>
#include <fstream>
#include <QTextStream>
#include <time.h>
#include <windows.h>
using namespace std;



const tm* timeinfos;
void tray();
void refresh();
void starts();
void wait();
ofstream dif("d:\\dif.txt");
const char* const path = "d:\\dif.txt" ;
void starts();
int hour=0,minu=0;
ofstream times("d:\\time.txt");
struct tm * timeinfo;
time_t rawtime = time(0) ;
int sec,secd;




int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MainWindow w;
w.show();

QSystemTrayIcon *trayIcon=new QSystemTrayIcon();
QMenu *menu=new QMenu("TimeUsage");
menu->addAction("Open");
menu->addAction("Exit");
trayIcon->setContextMenu(menu);
trayIcon->setIcon(QIcon("e:\\icon.png"));
trayIcon->show();
trayIcon->showMessage("TimeUsage","TimeUsage Is Here!");

QObject::connect(menu,&QMenu::triggered,[&w](QAction* act){

const auto& text = act->text();
if(text=="Exit"){
QApplication::exit();
}
else if(text=="Open"){
w.show();
}


});
std::thread third(starts);
third.detach();

return a.exec();
}


void refresh(){
for(;;){
this_thread::sleep_for (chrono::seconds(10));
time_t now = time(0) ;
ifstream dif(path);
time_t earlier = 0 ;
dif >> earlier ;

double secs = difftime( now, earlier );
minu=secs/60;
while(minu>60){
minu-=60;
hour++;
}
QFile times("d:\\time.txt");
times.open(QIODevice::Append);
QTextStream stream(&times);
stream<<asctime(timeinfos)<<endl<<hour<<"/"<<minu<<endl;
}
}


void starts(){
timeinfos = localtime ( &rawtime );

ofstream dif(path);
dif << rawtime << '\n' ;
dif.close();
refresh();
}


پیامی به رضاس1000 قبل از اینکه qtcenter رو بخونم درستش کردم :)

motherboard
پنج شنبه 13 شهریور 1393, 15:44 عصر
پیامی به رضاس1000 قبل از اینکه qtcenter رو بخونم درستش کردم :)

شما کارش درسته.پیام دریافت شد. :لبخند:

raminlich
پنج شنبه 13 شهریور 1393, 15:55 عصر
شما کارش درسته.پیام دریافت شد. :لبخند:
البته اینم بگم با کمک آقای امید مشکل حل شد
بیشتر باید بگیم کار آقا امید درسته

motherboard
پنج شنبه 13 شهریور 1393, 16:02 عصر
البته اینم بگم با کمک آقای امید مشکل حل شد
بیشتر باید بگیم کار آقا امید درسته
منظور من هم همین بود دیگه.
من که به شما گفتم:
شما(یعنی شما) کارش(یعنی اقا امید) درسته. :لبخند: