最近我一直在使用GCC进行交叉编译,并发现了一个看似复杂的区域,即工具链.
我不太明白这一点,因为我认为GCC可以为大多数常见架构创建二进制机器代码,而其他真正重要的是你链接的库和创建的可执行类型.
海湾合作委员会不能自己做所有这些事吗?通过单一构建的GCC,所有适当的库和发送到GCC的正确标志,我可以为Windows x86机器生成PE可执行文件,然后为嵌入式Linux MIPS设备创建ELF可执行文件,最后为OSX PowerPC创建可执行文件机?如果没有,有人可以解释你将如何实现这一目标?
我正在尝试使用JavaScript中的图像流来合成视频.问题是"视频"要么生涩,要么通过使用各种缓冲区来解决.但是现在的问题是图像实际下载的速度远远快于渲染速度.
如果您的图像来源发生变化,例如IP摄像头,您可以尝试以下示例.我注意到的是,"视频"仍然非常缓慢地更新,但是在观看数据包嗅探器时,我可以看到图像实际上被完全检索的速度远远快于渲染.
这是一个例子:
<HTML>
<HEAD>
<SCRIPT SRC="http://ajax.googleapis.com/ajax/libs/jquery/1.4.4/jquery.min.js">
</SCRIPT>
<SCRIPT>
function startVideo()
{
//when the buffer image is loaded, put it in the display
$('#image-buffer').load(function()
{
var loadedImage = $(this).attr('src');
$('#image-displayed').attr('src', loadedImage);
$(this).attr('src',
'http://path.to/image.jpg?nocache=' + Math.random());
});
$('#image-buffer').attr('src',
'http://path.to/image.jpg?nocache=' + Math.random());
}
function stopVideo()
{
$('#image-buffer').unbind('load');
$('#image-buffer').attr('src', '');
$('#image-displayed').attr('src', '');
}
</SCRIPT>
</HEAD>
<BODY>
<BUTTON ONCLICK="startVideo();">Start Video</BUTTON><BR/>
<BUTTON ONCLICK="stopVideo();">Stop Video</BUTTON><BR/>
<IMG ID="image-displayed"/>
<IMG ID="image-buffer" STYLE="visibility: hidden;"/>
</BODY>
</HTML>
Run Code Online (Sandbox Code Playgroud) 我还是一名兼职工作的大学生,因此我总是试图了解更好的做事方法.最近我不得不编写一个程序用于工作,其中程序的主线程将产生"任务"线程(对于每个数据库"任务"记录),这将执行一些操作,然后更新记录以表明它已完成.因此,我需要ThreadedTask对象中的数据库连接对象和PreparedStatement对象.
这大致是我最后写的,PreparedStatement每个线程创建一个对象是浪费吗?我认为静态PreparedStatments会造成竞争条件......
Thread A stmt.setInt(); Thread B stmt.setInt(); Thread A stmt.execute(); Thread B stmt.execute();
A版本永远不会被执行..
这个线程安全吗?创建和销毁PreparedStatement总是相同的对象并不是一个巨大的浪费?
public class ThreadedTask implements runnable {
private final PreparedStatement taskCompleteStmt;
public ThreadedTask() {
//...
taskCompleteStmt = Main.db.prepareStatement(...);
}
public run() {
//...
taskCompleteStmt.executeUpdate();
}
}
public class Main {
public static final db = DriverManager.getConnection(...);
}
Run Code Online (Sandbox Code Playgroud) 我猜对了,但仍然惊讶地看到,这两个程序,写在C和C++的输出,在编译时有很大不同.这让我觉得对象的概念仍然存在于最低层.这会增加开销吗?如果是这样,目前将面向对象的代码转换为程序样式或者很难做到这一点是不可能的优化?
#include <stdio.h>
int main(void) {
printf("Hello World!\n");
return 0;
}
Run Code Online (Sandbox Code Playgroud)
#include <iostream>
int main() {
std::cout << "Hello World!" << std::endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
编译如下:
gcc helloworld.cpp -o hwcpp.S -S -O2
gcc helloworld.c -o hwc.S -S -O2
Run Code Online (Sandbox Code Playgroud)
制作了这段代码:
.file "helloworld.c"
.section .rodata.str1.1,"aMS",@progbits,1
.LC0:
.string "Hello World!\n"
.text
.p2align 4,,15
.globl main
.type main, @function
main:
pushl %ebp
movl %esp, %ebp
andl $-16, %esp
subl $16, %esp
movl $.LC0, 4(%esp)
movl $1, (%esp)
call __printf_chk
xorl %eax, …Run Code Online (Sandbox Code Playgroud) 我正在阅读这个" Freuqent Java并发问题 "的问题,并且在谈论java.util.ConcurrentModificationException的答案时感到困惑.
我对答案的理解是,这可能发生在单线程程序中.如何或什么条件导致以下代码抛出异常?
List<String> list = new ArrayList<String>(Arrays.asList("a", "b", "c"));
for (String string : list) { list.remove(string); }
Run Code Online (Sandbox Code Playgroud) 我一直在Visual Studio中使用Concurrency Visualizer工具来了解我正在研究的WPF项目中的线程.应用程序不是多线程的,所有多线程都只是为了避免阻塞UI线程.当我运行Concurrency Visualizer时,我非常惊讶地看到大约50多个线程!为了让事情变得更加混乱,几乎所有这些50多个线程都花了他们的全部时间在"同步"中,据我所知,"同步"被"阻止".
作为一个实验,我创建了一个新的空白WPF应用程序项目,并使用Concurrency Visualizer运行它,令我惊讶的是,我希望有一个主要线程的应用程序,可能还有一两个用于垃圾收集或其他CLR的东西,原来有10个线程!

所以我的问题是:
我正在尝试编译一个需要使用多个库的C程序.问题是,库链接的顺序会导致编译失败.
无论如何要让GCC找出正确的订单,或者让我找出正确的订单而不必尝试各种可能性?
mipsel-linux-gcc ffmpeg_mips_test.c -o ffmpeg_mips_test -Wall -v -I/ffmpegMIPS/includeffmpegMIPS/
-L/ffmpegMIPS/libffmpegMIPS/ -lavformat -lavcodec -lavutil -lswscale -lm -lpthread
Run Code Online (Sandbox Code Playgroud)
我现在这样做的方式是从一开始,然后在错误发生时添加更多库,但有时它感觉就像进步一样,有时它似乎只是我走到了死胡同.
[编辑]由于未定义的引用,编译失败[/ edit]
我试图尽可能快地从数据库表中获取任务队列,同时还限制处理任务的线程数.
我使用Executors.newFixedThreadPool(N)固定大小的线程池;
我想知道是否有一种方法可以知道线程池是否已满,我的意思是当前有50个线程正在运行,如果是,那么我将等待一个线程可用,然后再开始一个新线程而不是睡眠主线程.
我想做的代码:
ExecutorService executor = Executors.newFixedThreadPool(N);
ResultSet results;
while( true ) {
results = getWaitingTasksStmt.executeQuery();
while( results.next() && executor.notFull() ) {
executor.submit( new thread( new runnableInheritedClass(results) ) );
}
}
Run Code Online (Sandbox Code Playgroud) 我有一个WPF应用程序需要处理许多小任务.这些小任务都是同时生成的,并添加到Dispatcher Queue中,优先级为Normal.同时显示忙碌指示符.结果是,尽管工作被分解为任务,但忙碌指示器实际上已冻结.
我尝试将这些任务的优先级更改为后台以查看是否已修复它,但仍然忙碌的指示器冻结.
我订阅了该Dispatcher.Hooks.OperationStarted事件,以查看在我的任务处理过程中是否发生了任何渲染作业,但他们没有.
有什么想法发生了什么?
一些技术细节:任务实际上只是来自Observable序列的消息,它们通过调用ReactiveUI来"排队"到调度程序中,ObserveOn(RxApp.MainThreadScheduler)它应该等同于ObserveOn(DispatcherScheduler).这些任务中的每一个的工作部分是通过ObserveOn调用订阅的代码,例如
IObservable<TaskMessage> incomingTasks;
incomingTasks.ObserveOn(RxApp.MainThreadScheduler).Subscribe(SomeMethodWhichDoesWork);
Run Code Online (Sandbox Code Playgroud)
在这个例子中,incomingTasks会连续产生3000多条消息,ObserveOn将每次调用SomeMethodWhichDoesWork推送到Dispatcher队列,以便稍后处理
c ×3
java ×3
gcc ×2
wpf ×2
.net ×1
c++ ×1
clr ×1
concurrency ×1
dispatcher ×1
image ×1
javascript ×1
jdbc ×1
jquery ×1
linker ×1
reactiveui ×1
threadpool ×1
video ×1