質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

4回答

3905閲覧

C++言語において、秒単位で処理を行いたい。

muton

総合スコア31

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2019/04/19 09:40

編集2019/04/23 06:19

私はオープンソースのカーシュミレーションゲームにおいても研究を行っています。
C++において一定の時間おきに処理を行いたいと考えています。
そこでスリープ関数を用いて、指定の時間を止め、処理を行っているのですが
画面がカクカクしてしまい、見づらいです。
そこで一定の時間おきに処理を行う方法を考えていた際に、settimer関数に辿り着きました。
以下の処理を行いたい際にどのように組み込めば良いと考えられますか?

使用環境はwindows8.1/visual studio2017です。

該当のソースコード

C++

1 2 char buff[256]; 3 _ApplicationPtr pXL; 4 HRESULT hr = pXL.CreateInstance(L"Excel.Application"); 5 pXL->Visible[0] = TRUE; //ウィンドウを表示 6 WorkbooksPtr pBooks = pXL->Workbooks; 7 _WorkbookPtr pBook = pBooks->Open(""); //マクロを含むブックを開く 8 variant_t macro = (_bstr_t)"abc.xlsm!csv"; //実行マクロ名 9 pXL->Run(macro); 10 pBook->Close("); //マクロを含むブックを閉じる 11 pBook.Release(); // COMオブジェクトを解放 12 pBooks.Release(); // COMオブジェクトを解放 13 pXL->Quit(); 14 pXL.Release(); // COMオブジェクトを解放 15

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yohhoy

2019/04/23 08:10

C++コードを提示されていますが、実際のシミュレーション処理はExcelマクロ側で行っているのでしょうか?そうであればC++コードは全く関係がなく、Excelマクロ側で対処すべき問題のように見受けられます。
muton

2019/04/23 08:20

回答ありがとうございます。 C++上でvbaを起動させ、マクロを実行しています。 その際にマクロの実行間隔が短すぎた(約0.011秒)ため、実行間隔を長くしたいのですが そのためにはC++上でのコードの変更が必要であると考えています。 宜しくお願い致します。
muton

2019/04/23 08:21

元々のカーシュミレータはC++で構成されています。 そこに自分で作ったvbaマクロを組み込んでいるという状態です。
yohhoy

2019/04/23 08:24

「画面がカクカクしてしまい見づらい」=画面更新が滑らかでない?一定間隔でない?意図しているより高速/低速に画面更新されてしまう?
muton

2019/04/23 08:29

説明不足で申し訳ございません。 マクロの実行間隔を長くするために、vbaを起動させる前にsleep関数で処理を一時停止させています。 このことによりマクロの実行間隔は長くなったのですが、処理を毎回停止させているので、カーシュミレータがカクカクしてしまっています。 そのためsettimer関数などを用いて、処理を毎回停止させることなく実行間隔を長くしたいと考えています。
yohhoy

2019/04/23 08:34 編集

これ以上は状況理解できないので手伝えそうにありませんが、タイマー処理とSleep処理に本質的な違いはありません。どちらも一定期間プログラムの進行を停止するだけです。真に解決すべき問題を探ったほうがよさそうに思えます。
muton

2019/04/23 08:36

回答ありがとうございます。 タイマー処理も一定期間処理を停止するだけなのですね... コード全体の処理を停止させることなく、一定時間おきに一部の処理を行うことなどは不可能なのでしょうか??
yohhoy

2019/04/23 10:26

所感ですが、まずはユーザ観点の「画面がカクカクしてしまい見づらい」事象の原因解析=あなた自身が何が起きているのかをプログラム動作の観点で説明できるようになる所からでしょうか。
guest

回答4

0

どのようにもなにも、タイマイベントのハンドラにソレ書けばよくね?

投稿2019/04/19 11:29

episteme

総合スコア16614

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

muton

2019/04/22 07:35

回答ありがとうございます。 色々と調べているのですが、幾分実力不足で手も足も出ない状態です。 タイマイベントのハンドラに書くとは具体的にどのようなことでしょうか。 宜しくお願い致します。
episteme

2019/04/22 12:14

あるいはスレッドひとつ起こし、その中で「しばらく待ってexcelに書き込む」を繰り返してもいい。
muton

2019/04/23 05:02

回答ありがとうございます。 教えていただき、ありがとうございます。 サンプルのどの部分を引用すれば良いのかまったく分からないので、もう少し基礎的なところから勉強してみます。
guest

0

自己解決

if文を用いる事で解決できました。

投稿2019/05/07 07:14

muton

総合スコア31

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

episteme

2019/05/07 09:25

それ詳しく! 「一定間隔でカウンタを+1し、カウンタが規定値に達したらXXXしてカウンタクリア」みたいな対処?
muton

2019/05/15 10:01

説明不足で申し訳ございません。 仰る通りで、fprintf(file3, "%d", ++kaisu);とすることでcsvファイルにkaisuを+1していき、if (kaisu % 100 == 0) と書くことで、100回に一度のみ処理が行われるようにしました。
guest

0

単一スレッドであるかぎり"該当のソースコード"を実行してる間はシミュレーションとやらはできないから、
"該当のソースコード"処理時間の分カクカクすると思われます。
それを解消したいならスレッド起こすのが妥当かと...ってコッチで答えた。

投稿2019/04/24 11:46

episteme

総合スコア16614

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

muton

2019/04/26 04:32

回答ありがとうございます。 スレッドを分ける方向で考えてみます。
guest

0

カーシミュレーションを行っているという背景と、
提示されているソースコードと、
一定時間に行いたい処理の関連性がよくわからないです。

画面がカクカクするというのはカーシミュレーションの画面がカクカクするということでしょうか?
(以下その前提で書きますが)
カーシミュレーション画面をリアルタイムに動かしつつ、
別の処理を一定周期で行う、ということであればスレッドを分けるしか無いと思います。
C++ならstd::theadなどでググってください。OSがLinuxならpthreadでも良いです。

タイマのハンドラで同一スレッド上で処理してもいいですが、
その処理が重い場合はどうしてもカーシミュレーション側は一時的に処理が止まるのでカクカクする可能性があります。

投稿2019/04/23 13:44

sin_250

総合スコア112

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問